@echo off
rem ===========================================================================
rem  SSF2T TAG v2 (preview) -- four players, two teams, for Super Street Fighter II Turbo (RetroArch)
rem  Generated by tools/make_release.py from the release spec -- do not hand-edit.
rem  Drag your clean ssf2t.zip (Fightcade 2's, or MAME's) onto this file, or put this file
rem  beside it and double-click, or run:   ssf2t-tag-v2-4p-preview.cmd "C:\path\to\ssf2t.zip"
rem  This installer holds patch bytes and hashes, not ROM data. It makes no network
rem  requests, never overwrites its input, and refuses anything that is not a clean ssf2t.zip.
rem ===========================================================================
setlocal
set "ROMPATH=%~f1"
set "SELFPATH=%~f0"
set "SELFDIR=%~dp0"
where powershell.exe >nul 2>&1
if errorlevel 1 (
  echo.
  echo   ERROR: Windows PowerShell was not found.
  echo.
  exit /b 1
)
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "$t=[IO.File]::ReadAllText($env:SELFPATH);$m='#=PS'+'START=#';$i=$t.IndexOf($m);if($i -lt 0){Write-Host 'ERROR: the installer is damaged (marker missing).' -ForegroundColor Red;exit 9};& ([ScriptBlock]::Create($t.Substring($i+$m.Length)))"
set "RC=%errorlevel%"
endlocal & exit /b %RC%

#=PSSTART=#
$ErrorActionPreference = 'Stop'
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.FileSystem

$SpecJson = @'
{"patchFormat":1,"release":"SSF2T TAG","version":"v2","preview":true,"set":"ssf2t","title":"Super Street Fighter II Turbo (World 940223)","detect":"sfxe.03c","otherSets":{"sfxad.03c":"the Phoenix (decrypted) set ssf2tad"},"members":{"sfxe.03c":{"size":524288,"crc32":"2FA1F396","sha256":"838bbe08eb743a1bcdedc3add51561e78f393504911c56670b11ca7745d259ea"},"sfxe.04a":{"size":524288,"crc32":"D0BC29C6","sha256":"2b5b904a9c3bc948d6765895388e97913cd96953d2e7728c53787fbe6a4a4e1c"},"sfxe.05":{"size":524288,"crc32":"65222964","sha256":"ad4ea12bdd5299bbbd862a46c56b40522752283353870f4cf2abc4e2678b1dcc"},"sfxe.06a":{"size":524288,"crc32":"8FE9F531","sha256":"357e341b071285be247fa8a755575705a4da1875eafe90f701fee3ae588e204c"},"sfxe.07":{"size":524288,"crc32":"8A7D0CB6","sha256":"acfdea951180c0accad4f0dacfc7c2c2aba67502fdb80ef34417aea5240190ab"},"sfxe.08":{"size":524288,"crc32":"74C24062","sha256":"e33f896e1d45d497b558dd4139afe967ff8f59daaa32027bcb39a9c3828b5479"},"sfx.09":{"size":524288,"crc32":"642FAE3F","sha256":"4612b2b6e64b2c3ca2d6c2fd88807db87b2d39e4d5015f3d1c11ab5d0877211d"},"sfx.13m":{"size":2097152,"crc32":"CF94D275","sha256":"54a738964d44cbdc1dac3a1cb7dd400a35855bc815cb0fe02fc2db2833defc80"},"sfx.15m":{"size":2097152,"crc32":"5EB703AF","sha256":"6666265d84da4a2b815545731d068736d1f4dc7fb088c23b167242adf71a48ca"},"sfx.17m":{"size":2097152,"crc32":"FFA60E0F","sha256":"40df56cf82388684ad81242f393b8311460aa24f1e05fbb0aaf6a40610079811"},"sfx.19m":{"size":2097152,"crc32":"34E825C5","sha256":"c90642f04d64409110c5a69f05db64b8ecddc61c2a41940104bf229ec1d4cdfa"},"sfx.14m":{"size":1048576,"crc32":"B7CC32E7","sha256":"6500f8613d48f7e880e22afdd50d6695d9941cd782085e452d0beece9b2f9200"},"sfx.16m":{"size":1048576,"crc32":"8376AD18","sha256":"44b4a66645a2a982e00961c24789bf18c01a8332ad0914940f707b78d9fae475"},"sfx.18m":{"size":1048576,"crc32":"F5B1B336","sha256":"5db3d68b3088f7596618f6adb9e879067b1a94eae619e340c98696e0a39dd99a"},"sfx.20m":{"size":1048576,"crc32":"459D5C6B","sha256":"0f045013e1f0d04febe1819d518516e67d8329ae8a1a5d0127babd283e5edb7b"},"sfx.21m":{"size":1048576,"crc32":"E32854AF","sha256":"eabc7eac8882a1d3600c8a5ddcc5a72d20dee5152af7d025e3ec0b923bf7a321"},"sfx.23m":{"size":1048576,"crc32":"760F2927","sha256":"4c5a2f8b746fa5a4a7ce39dde7a7e15e879cb4b36f035b79cbdf9913c3361765"},"sfx.25m":{"size":1048576,"crc32":"1EE90208","sha256":"d40e6a5ad1659368cde19d052a460bc31319a4b1d24ae589b7bdcba3be3a6e30"},"sfx.27m":{"size":1048576,"crc32":"F814400F","sha256":"569e44101fa2dd0ba5b47d8c3692fe95854202c6db2d4621247a3e269e0e715a"},"sfx.01":{"size":131072,"crc32":"B47B8835","sha256":"d537d760fa86c3d77cb566f6d4345c6590ff6c061f241b574b59d2e73c88b7ab"},"sfx.02":{"size":131072,"crc32":"0022633F","sha256":"45aa9b70ae78f1f29c382d2fea4bf702ef6ab982f3780e7a5c53d9d5e8c3a6f7"},"sfx.11m":{"size":2097152,"crc32":"9BDBD476","sha256":"cbf9d809b1d5958d88988c604530058272c39d3e8e7d00532a760f20e5ba0832"},"sfx.12m":{"size":2097152,"crc32":"A05E3AAB","sha256":"2197f85af99c7a2b4d61f8d23dc7bcc4ce30faf8fb42878d5d87b95c16874ca3"}},"parentMembers":[],"key":{"name":"ssf2t.key","crc32":"524D608E","size":20,"shipped":false},"patched":{"sfxe.03c":{"sha256":"88c0c77719b74d08789e75aedf3b8b7d66ad83280896fedfb2e1a7aaa0e17b3d","cleanSha256":"838bbe08eb743a1bcdedc3add51561e78f393504911c56670b11ca7745d259ea"},"sfxe.04a":{"sha256":"328b6fd359e3d59e98edc51f5b5158539b4b6da6ff758b01b9927363a05f3d4e","cleanSha256":"2b5b904a9c3bc948d6765895388e97913cd96953d2e7728c53787fbe6a4a4e1c"},"sfxe.07":{"sha256":"7bd365366147cbd9bbf71df07d08152298a0cfd6eeb83352778d2da3b62f5625","cleanSha256":"acfdea951180c0accad4f0dacfc7c2c2aba67502fdb80ef34417aea5240190ab"}},"patches":[{"member":"sfxe.03c","offset":"001bb4","after":"75f2b5818e56"},{"member":"sfxe.03c","offset":"001c12","after":"9a"},{"member":"sfxe.03c","offset":"001c14","after":"55a8bdf0"},{"member":"sfxe.03c","offset":"001c26","after":"b63089f7cf27"},{"member":"sfxe.03c","offset":"001c88","after":"6aacc6e7"},{"member":"sfxe.03c","offset":"002cd4","after":"477610ee18dd0a425a82a52c"},{"member":"sfxe.03c","offset":"004052","after":"ea0b21cdd2de57b7eba3"},{"member":"sfxe.03c","offset":"004634","after":"b8baf26f2c3d"},{"member":"sfxe.03c","offset":"00d752","after":"aa072b2841dc"},{"member":"sfxe.03c","offset":"00d88c","after":"201db1cb"},{"member":"sfxe.03c","offset":"00e1ea","after":"18e0d902"},{"member":"sfxe.03c","offset":"00e1f1","after":"1e9f50"},{"member":"sfxe.03c","offset":"00e70c","after":"fa9208f45f7e"},{"member":"sfxe.03c","offset":"00e74c","after":"02f9d2f189cb"},{"member":"sfxe.03c","offset":"00e798","after":"cb7428ed211c"},{"member":"sfxe.03c","offset":"00f94e","after":"38ec"},{"member":"sfxe.03c","offset":"00f958","after":"a2e2"},{"member":"sfxe.03c","offset":"00fc9c","after":"2c43b0995e54"},{"member":"sfxe.03c","offset":"00fd54","after":"e96b"},{"member":"sfxe.03c","offset":"00fdd4","after":"ef03"},{"member":"sfxe.03c","offset":"00fde2","after":"9bebf48df159"},{"member":"sfxe.03c","offset":"010cc4","after":"fae9335d2ddedf126ffc"},{"member":"sfxe.03c","offset":"027fa8","after":"723fa02aa9aca49afc00"},{"member":"sfxe.03c","offset":"054760","after":"f208718f1d0a"},{"member":"sfxe.04a","offset":"046a64","after":"19c5bfd0281d82e6"},{"member":"sfxe.04a","offset":"046dfc","after":"5cb324b24e9528cfa1ef77195da5"},{"member":"sfxe.04a","offset":"046f30","after":"f7c5450411427de431cb5c07226f"},{"member":"sfxe.04a","offset":"04c4e4","after":"70fff8ce42ae1d24"},{"member":"sfxe.04a","offset":"04c52c","after":"97dfa7593af95127281ae37b52d2f1adfc24"},{"member":"sfxe.04a","offset":"069962","after":"be6e3b8a6525"},{"member":"sfxe.04a","offset":"069972","after":"43f828de7de3"},{"member":"sfxe.04a","offset":"069986","after":"c967fc5d0b12"},{"member":"sfxe.07","offset":"045874","after":"544bc3c890dc94a4ddb1d0370cd2cf65526125805e42498eab32bc955fd8d0582eee18a321d92245b1dd873a5a580fb36bd4ec9905e11bca054b8ea430c6469c8bb5248deb32a47cfccf74dceeac1645c09c24d3b5228a25847416a9f8a3dec98b8e985779b7136acedb1f71bc8aaa67965f00440d2d71373945e69979578bce112202358dc7158b66492d3ca7d1dba63e0f65c9a863594a2a7ca93531fc7928b48696b062f910129d280fa3a8406e"},{"member":"sfxe.07","offset":"045924","after":"c2a25f6d2c3e054031624a8638fbb8941a63107458884dd82522719eab106735b5fe681221219938a48202ed1fb6aa1feae1a365160266436afa539908d894c70031e12ea88ecc7a74dc1a476f2831c3be323edd59dad41ab7619bcd603034296a50b119ed23396da35ec00fcdc374bab91fd4f0848eb1563ea90739a398ea0cb9f438f1821e98c27c7829434096963abb1d027f6a5f72e9567125392e005f779e0ad1203a123271cb60b9a0d81ebecd05cba493a820ba32ceb8cb48cc2bf45d18c8e7313fb002fd1d4b41209b7e978a83de4b098abe7f9e3de4d38a1f3a2edb9076ae6480b127a3a7b05fde59d1fac9107089"},{"member":"sfxe.07","offset":"045a18","after":"7aecd2e1855dd4a0a3a9bcc55f93ad52a41712152cf9ad1df5f92cb6ca1dd3e983d8f2cefa9bd021f06181168c02ed1f2cf6a327a335cc893be218836e2cad18570a7d43b8fbbc50468b1e5a1c2db2efb452167c724dd88eca547ec42fce51804c0809149a2b2e15b4f0b2a5b7581ac54d36b44f80cbfd1a7af8367008975d746b245f151660f70aae582d69862d0300a90f78576babd364242f133708a23e1c771ecfa3773767b7ef662c88e96354277df72a166ed021b5552db138078badec6fba12880e37b19af6ad957256fc7ced5b5b829d746bc23e966cc0180f9d339609323544e97672ee6abbe549bc0af0f02fce769e708f9327964bc545eeb3fdaf4af0709b5547cabbdbdb9b2f26abdca1bc3740e1a2aa0f9fc6bb5b5e391a5e46893ca6a6ba4fd1468997c7e2819ecd9714d93a7f96f3d2afccc13f3d2ec4f7738ec8d129554549da9ab65d1fe0e5de194cd83fbac8e8f4d335718026dd159539204487d61406b509d7eeafe1df5967c48a53393276006f171c9f2100c2915eb98a9085382a01bec3b1f8c4f3e3864f712f046eb70514e49e585596a5a0718910cc89e6794561702032760c98a968f4b248e6c0063dbe9c4806596d6c3d8efa1e602e8afb3317e5d22d3dfabb0d92ab13c492060db204001973ba1026692ebdcd5903f1702f4891ae9d2206eec7445fbd989462bbccd97aa8c4a80db193c1aafd10e8302be09de58c93090ab9c85744b37f2307759109db410313f70ce0c021b1835d8a3230f6bbd2565079a83cc1482c4edbac5424a6899c4899226572563189d785a548f5ecd02c1998f63c567763bba89921013fc0b1d3b31c09922319073fc80a2105adc460401f4ad0f46e6e30ca95fb6eea112306108d88155a081bef21449d0abd94a3c8"},{"member":"sfxe.07","offset":"045ca0","after":"1bdebfa9759d8d7d4dce3fbd27152a2bd1c008b0d610b662f9a86bebbf5770299d0c83ecc0c66f7c90a4b892a54aed8c0fb0746910b22d4aa4b552594f9eb06c62f0efc4472c4d18b4441ff455833e2efcce4c16053c37c2bbbcb33b41d8d4d90895e0db801544513f11f7c5682e262e7ef32acdb39d4ed867c03e84859d7e98e570aa2a935cd0b33ab3"},{"member":"sfxe.07","offset":"045d2b","after":"5da9172609e6f3cf84e6b92781004310c95fca1c6437eb2209ca38c941aedfad6d24b33cd68a3c498ea78e429fb7f4b58369baf6173ba242369210f680a0d5f9b40490e1ef9a08d43f611fd697ac6f4c710314d066cd56040de635cabbdd407baa503fe01dac75caddca365f9373a482d51cfc8527c7258cb88650edb09150de0585ca742818e9b700fbceb7876dd3b360dadf6ad341ad8e295b5d972fcc28f3c26bc89e476f9bac8b246be7b067d6b3dc12410a3aa051"},{"member":"sfxe.07","offset":"046074","after":"adafb431ea890c71e613f9ba4c54bd8898170920c510259fb66930a4e5c8ec29077de99c80044df13d5606f24693041b30ae0ae9236e4118cdeff0a09e4c301525b62674e0bea5539bbfcb51d17f3a48147bbb84d0934ae599844e83370fb010b9ce99082aea1b70d549e3ff68dabe3439be32d21fce227d2df9b0237768c3595f2d15d41329cba295355fccc0647979c3b53c87c38cf2604f4a86040c766db0ccf52cd11ac6fc0de0c41e1ae0ff86966e77eeb0eb1b1ea357c27cfb476c6a522dc1043204"},{"member":"sfxe.07","offset":"04613a","after":"f103e4e294d4c860075682df3e6a2967731b29aa427d69c262339c447436cccf34abee91c28ffbc46ad48819b7a123b7e4f14db86821f6a8b7af4a709502ba4a1ada14c84c041473b1dbb52652492ad933e20653dc90b4e891483c8fd2a72245e85d6f01a5fd26fdc550a1b1e92c2b6cbb232eb773d73de22bffe6785c3d6b791b3844d36b2a773cd5cea2775f6521a78998574e12d9bbc467be703bc15ee73cc8900fa99ca3"},{"member":"sfxe.07","offset":"0461e1","after":"fc80b8f6fa27df9c905b85ae81f8bc42faa8e9ed60adc0faca1f73f67f8ebc2b51f719a818eb44bfe826141ec479855d19a93a77c0fc5727e9819a43390c1db2d085a9efa0e1e31830ad5325e0937e1fbdef5ed2163c3e7cadb09565843f6fe66adad921c4e2d68a3131c1d4526bb31baff4260d8e20ac6b82d56d191c46a87fc9d731a24d627ee09c71d086929e4f100d77dd10543b96669ed0fa45ef469b5ce61286315e74b7aa9a97821a1d8b84d71d7a59ccb8d9ba3d9e58d231ea731125af06e166f15e6c417b3728094752f77015908cb5972d057fd31dde0779c5a63da77d42c7312c626c498746326d99c566a5ae4dfd0bb0f5a92a1bf6446441ddfffe201023dd93804a43986e5aa17e79d58e3a961ef683577638a5b1fa570f6ed6f9ae580abc304792e1427d7290a3c5aeec97592e387d3b2b6aeaeb7437a2ee33c6b9a4a00edba707ebf38bfcd5347167c12c8d87836dcc26c95613a97293f392b3684a4d2b668a99d88dcbc11013880c3fa26812ce5bb7376cfadf907be8"},{"member":"sfxe.07","offset":"046360","after":"a5778b040abbb03580936676e9b43d471663bb0af95fc43721cc138c4842c712416ddd531394e43c182b0f0b874e3a2f52ce8657d0dfbcae8693eee51cc596f3ed966aed7c6105b5acbbb77a2e57369bac5f4a6879de74f023495b263a4c8d7d353175fcbee3101b5ce786979851592b63fc200a701de643cf09e993b67b3b33838752ce884e3174e55099567291019cb3265f5d2ba916498cdcb97584"},{"member":"sfxe.07","offset":"0463fe","after":"eb0c56f5917e850fbb27fe1ef25367dc0bafed04a287bd8ad2821b2a048145c82745072658e86e7b815e18b6d6e306d4e1b742fe127015ad061453fbf3dbce9d218b95fa8bfa5f880e673dd3c260e1897a510c213b55c1bf028934058f62abd4d3905c287c41b0a44bd375b267c353e1e82b5ee5881d5a223062ce10c4241562e64cba825b2988694425a42e72a0bce297fe7704f17763a65f60c7ab4c7194cce26ec47f69e2d4cbf53c5740fca6e8bfb201a3306a1d137fd25e9d13e893044a1738d6d627bfeac17ba6cd02c113c83fdff33060a5c5952a50af9cc611f05fbdb10d9e019df0c03c9ecadb3c107fdbc1b29e65e7e0fac4642df1095fbe42819e35d102fada06805f11542811722ea75708d14a1895a9b528586e59a787b13849a071b5f18022b49c90a6cabc0c46f39a7d041a9c53ffbf8f4216d5c454e70bc0d9c2"},{"member":"sfxe.07","offset":"046541","after":"20d32702db8649213843e6020ba6a40f42a7fd3ae7d7f335c83d268719425f58a5b35554f0674c8060acefffa3ab2dd1ad6e33527a2ff0cd5d733d2bfb13c17771cab6c772c9d7fb58160a39e37e80d7a3ccce1996e9df49d365b493d8bbf0f3ce6c7035da7d3ee2135b5eb83ae69a237af95bd84f9742bb0c325c5070d1482099d2311ca93426e850f7784c5233d8836d874dff6d32b3ee88740748097e55505c4a2088b0e86b1e1b3db4efdc7c0123dd08e6"},{"member":"sfxe.07","offset":"046874","after":"0359d32b577d6fe9d67bb8af4595a582ad97f9102852cb8befac0742185de19ec80b27463f8765a03229b2c1214289594855036ce9fa6639cbcfef554b2005718c3ed28064fc459e7d56403971067a2b0e977e50d8caa62f0dbcc14246aca70c22a1e762f0edd721bbe11fa90feb8d7fe14f2a205fb6dd147345579fa3a139b0509ec8f436bcb0fb228f9ae45a62b3c24987e07e7f932aa2606882ba22c027f325d5093bf6f206677099512333d1a824d307af7e454a25940ef0d5eb51068476bc0baf33e06a5929918b5638ea8758fdc2796874621d5ca3531bbf2bb1dda61ebc7da123d1dd1253489867d5d56e192e9d2d8682780c808c5d5fd03ace61dc1a440e33e95d"},{"member":"sfxe.07","offset":"04697a","after":"18cdf38eb12b3a4005208a69d8de7c77713f89c0d0f0ac489fbb99453f1d7982d25b09a10dcf2d939a12cfa7ef3f64f205aebf8ea8b65fccfd9bd62ed384d601da3961dcaedfc9f29abbb49f60142825ed98848366e6bcecd7172a6c526f9aee26b450814e7270a0d89de48b3aa8f8a62dfaef17089b2eb107889541cd2f596963dbf8b2c2872169fa293ae8ec281ecdcc88731cf5c8551418eb754477d8d76b87ce0370385dc2484f9ee497f06b37aafacf067c30bbfbc4bc2405e3b5f0472c39413322d23ce382ac7868e420c2d5123d9f12b2ce38da16fb199d8d03c08a1ed5b862dab3452e785d075b92554469c9b38bc7bdfcf6fda91d759b4a01a64b9bf1b485e5094beabf9cc8147c0b725c31d39288b7ce797649b0a1c2e96b40d12fb171116a540188ab1201a0a3d0ce017b34268e44858eaa96cb101ede0cb6fb66dfda5ac42d1889657381dc90061843d103ab010d5db794ad203187d50a5f295158a9b65acfa5188e5eff09976e8067b09c2818ee1c4d426cda28237f30539ff381e38feeeab7029a77e7239a5148597484294818d185eb05facc8723eb1c1859f17324cefa10bf7688ed1f7b4e715685e3b7728ec45223dd87e9350f7a4a45e2fa70cc6598097dfe2ca1fb25d68da65375e825291d6ec2d59718bbbc9df9deb7c9600235ef0e53d8323a208dcc750e6d1afbaafdfe9f929770543d2a777de47fa224a190550eee34a0aa48ebacce9d90406110a239bd6990b60f09d1b0d6949ee83d4d0ac84261ba8402bea397baad1548341947a9b59335ce31e0124cc19005f8354ff8dc4deaf5a1b49cf081d0518e26a8a1248740d34d0c682d83554a53633055980c26b56ade6c528f5187ec1f77d14ca5a4c607d9100d5c250d1dc06c53bac9e302483c53b1bba0ded58422e686878cfc973833bc0fdb1f8fbcb71469681e2daa113777238bc3d4ea9e53df043dc2454a463dca7bc5e13089baa49e914a50e501d6806a52660eef835175a3721a70abd01754134a4a2873f59c982acef94794e930772a06162c3735b96c8968330f99227e963518edb042977825a90dea9fdb11ad1b29eb0908c63fffef89e6d634b45a0b74cb6f06c16db5957e5d138ad3484873014da44453848fbaa8fbd0759a2443a9c6e6aa6a4407a46f445a07eebcf43f811979d64d93050d5aa7f22ce059f0055105cf06cf09644f118ba03eaddabd6ca302b70c3a8d39a7bb2cb7e377bd61211074d940e3b7c3ef744d260c485036abf25680c29f406178476392b9226f2c7f6df4cc4e1d406f0f554fb1eaa282c7341e1837b834e45bee939d143d225192d830523cb387828b2578153d5162e3ec24f819d7a612f4483bfad5e98996abffe261997f140f6425ae1cda73"},{"member":"sfxe.07","offset":"046d59","after":"dad29f53fd37973227450fda640aa9f17856ed948421595f0462"},{"member":"sfxe.07","offset":"046d74","after":"f9eb4155cd06675a7585046c"},{"member":"sfxe.07","offset":"046d81","after":"3b0705587aa7eba7b38a74df0159f5611aa0e2e8a492ef63606fc921d449faa5536b868df016c113664897da4520a1587ea59d839aa2297dd0a03cc07d7ceaef7ffc288f8129e0354a0d3905e5e94a4c79ecb52807f534068d586ed8b3cec7c66ab8776e9e"},{"member":"sfxe.07","offset":"047074","after":"58778edb5d3c1bafacff"},{"member":"sfxe.07","offset":"04707f","after":"b693b18a4b98b97c4bd94ddae4ed10f609414b1a95a4e697adbf3d36dae16de16e30b2e510ba0b528b64b69422e08a39c8d282edea99dbac9c72f9245a1b80e5ebac812a14ffee728ec1bf3e9af7961b23b125252501213e0be250de35e5a9a0d82d2857ba11f7c4c55bf66250d75ff3a5c5d46f9da89a309c68a28f39c9985a61c37610d646c80f8ed0c8"},{"member":"sfxe.07","offset":"04710b","after":"abb1d5d69f99e19ac58710d5388ef6cd95116ea4f6e9cb49ca312b8a91cc9a5791c7cbccf024e90966db65f5f880961f1057135fcc2d212f29a357fe04404b197d2e2bde865ec61a78306dacf80332785d60fbf3bf7078cd113ae10e229ca6fea7b3b40135a1e928a8576f6119f281db99f6716a248ee89f8e1b67d52d74959dd2b92d46fa096b7b457893c5e02863ddcd0bb0d190c6b61505b0529e4794cdb507b37f73732f4f3ad6c52d13be0e42d3af9e96662a5f9248c94e988b3f4ec2f75c48d19016a9f00ce2b3a176a7ac9ccbe2f27319bcbd3c4cbd8e05b533d8faaa4a1d3b122ccb6917200a0b567111661d0fb5dd669190b385d67d9b4bdac6db53e93c797b731028f9f856454eee338948b850569af2f93be6c1789bb70a0922803482e650d0f468565daa9779eb5085d827da2d74e5c3b7ee3df43e0f46de99547517a8fa1fb4d66f1f3b36ccb60c63d7ed5e45c4d412cfbc5ab528fed80a8b7f9e4559137ac83a8b756fd51393edceae505d3d115b85a73288436ce060ccbb3b78b074248146620f634de5d999d15b621fbec7a6cf9e692ba00fb86197d2b55fbda8961a9e18ace3bf99d70b91bdcf4c37e75a03cf76f1ed28275e074a064771450fb49e06426a777119ec77e17dc3dca58994c42aa499ea07e7ebf2f55dc59d921eca937cbd65dcb53e5a5a190c3a33426edc169512ef317d9236e018f4d918a82f1084773b6bbbe033392efc2ee95a9d0f1af7ca87d99a94f96f5362588da64c785a454af6cc75d54619a5e29e44788e5158ae044f53d6265398f7aaff468381df8e6f1393adbcf1d6b216e2ae2f229d3b96fa08f8ea2aad953c7ede525027fd2c0ed8a9d68b9071111e856288b9eee075abf246866dd4df2d453bf58521910364e37a2b83ae5cae6e6c01b745e0f091591de2e73bec4b7134ab886901a860a0bfb01e2d5eb8b7d410fa6ef5bcd5156dc668d6da2fe1c9abad9b9f491666122a8dc67ee11b023f42374b7f40f4bfccd4"},{"member":"sfxe.07","offset":"0473dd","after":"6a97cea70641b80c1e117fcb31b460065b70793ec9078bd1fdaf4364a69c88670c903b7796fd6794fbbe8bb9a0723b3e3de1f5c894aee41432b043923ad4cfae8394a90fd9ae02317ae2721ca9cc7b074472b7d4d355d43476548cddb39b6a18714d75708272546e89293cea4073fe1cb93d6b681c14384d670791557df2ce2a885a299a2dddbc2c651890b6e859954eb8c9c4b7c3280af4945c40825cdc1b3862ddfd33a41e8ded2273f17b5bb9ddd396d1c9213abc0a08dc847a438cf2348febd0ee862142132d819a48fc7daf18450129acf21484c5f3556d5c23921ea5036881d14a82f1b47c4ce7867a7fdf8ca73e5fbf17cbca9a118547c2bd3b4b2e45bdcac7ce4b1d2c2007060894afc684bb1120256691a313fa7f0f21969682be7fff59359933b16ca9f36d9e9dbb1ce499cd"},{"member":"sfxe.07","offset":"04750f","after":"435684d678794f4c82be72ab0f9daf927e457cd20487b795f7031d69312699808ada3b5173a964dfcbcfd8e45feb716e404f20c06f02985f4e40c5d719a587fa4613ac19a0a97665fbbbbe2cc2397f945c4f125e20d0a8c6d4effef8ed4a3bd5dbfdadd5e330bd776fe2bd6a28b121f3c05382f2af0e653df86f78f684adc27d20de9f7096f97dc3f7333520179ad93f591291baa47670ece2890407"},{"member":"sfxe.07","offset":"0475ac","after":"fafc08"},{"member":"sfxe.07","offset":"0475b0","after":"960e08"},{"member":"sfxe.07","offset":"0475b4","after":"042308"},{"member":"sfxe.07","offset":"0475b8","after":"0a3d08"},{"member":"sfxe.07","offset":"0475bc","after":"d85908"},{"member":"sfxe.07","offset":"0475c0","after":"b07008"},{"member":"sfxe.07","offset":"0475c4","after":"428a08"},{"member":"sfxe.07","offset":"0475c8","after":"62b408"},{"member":"sfxe.07","offset":"0475cc","after":"acc208"},{"member":"sfxe.07","offset":"0475d0","after":"c0da08"},{"member":"sfxe.07","offset":"0475d4","after":"70ed09"},{"member":"sfxe.07","offset":"0475d8","after":"e40209"},{"member":"sfxe.07","offset":"0475dc","after":"4e1d09"},{"member":"sfxe.07","offset":"0475e0","after":"783d09"},{"member":"sfxe.07","offset":"0475e4","after":"d45309"},{"member":"sfxe.07","offset":"0475e8","after":"c46c"},{"member":"sfxe.07","offset":"047874","after":"cc331e82f9a793d29d6561661fc83094df4f48453b349f39230ba629fb53325a0325e597958a558cdd4e20e4b684aac6e70744e79a3a0613540cd274335e011b9b380b65770c47536cf1220764095e5517c0c066cbaee7f673e14206f448b8566e9c79f99cfa33aa7c77404abe9657b7f33ec25cbd55497014ebd3b2664f2efd4b51f733b7dcbddef3fc4c803a884ed44f297b786876b5bd4154b9bcff306aa61f18868f3d872ebbf0309e34b35f0c529f5c39ddebf95771f33217dbb1721d04ff6149e91623f0af5e9a7769360e5e20acfdcf684f08a3e89a1f072ccd207bdf9d5699caf950d930108e7be403e4b81aa618fdb5347722e93d0b4bff0645736a06619d595c55054be0a649924b5a077ecfce8834de6919d139db4b7dde7b7a5c367487dbfe31f105ed0ca21ca4aeaba8f0cdb2900e2c22f6f7a646e4e03ab982a4"},{"member":"sfxe.07","offset":"0479b6","after":"1c412608c8440ec7cd053a68b42227efea5edecb828bbf2201b1a7d55da08f8124f5c3dbafbcae287bdb60a6cff56679bd6fec495b361fc4adcba657c56e638d93c32df8a0eca79f626fad46b54411cebcf4013469d7b99c2b44926d384045952efc598abcac15ecd0f0dc7937c1972aed39cac9f255d9abad2f27c65eac8360d57a354b20404f474f230f1543bcb4eefece94ceb2075e9e6b0790ef901fad15547b41bf9e9978ca99efdc4cac6cb591ac44f52d641b23c4db3f5aa45ececf5f486f34d45b7544f89a58b955eca7249470f046c23a8a173b94fdfd6a2c77582a4eabda80a2e1360c72312e020e1a6a18f03bb74cf593fbd8a706bfc170a689f4149e2351b4ab074eb1243fb53cfb6b8f93d206559eac5b5f540bed1b23063f6fd0bbb9d91830b2b8215e0e60e03a"},{"member":"sfxe.07","offset":"047ae5","after":"9dec9047b9a518ea8faa943af80f69b1646fe9698ad889dd2352f2b0b92d79306244118a97054c11c836ddf7ffeac28c8ec69f1422bcf7b57112bf031b6efbfa6d8889549b7bdd70a007cf6efa13a88d9ed1a7faf30221afc2eadeea17b4af964f77dd9b5e3e21f46da6f5dc7b8c65c6a910fb909e8d1047f58a7844abd5d170a47a96c77274081b0f60818d5cdffa8d5abb03cdf41bb9a02a6172be374ebf7e27a581dd0e"},{"member":"sfxe.07","offset":"047b8b","after":"89190a5e702b037193adc4812f8add4b2aac1a4246779ab0dd4b1d5f2061310db1fa5bbb4120300371a683ce"},{"member":"sfxe.07","offset":"047bb8","after":"1f7e2644519f5c7907a7b2f20bf7d647b37a692beb44a85fafa1719bc278bd03e34774f2bde676fd0820ec8e7ac20394018c11e3094458bc5c9e8febe04120f81c808ce2ce7fd9e4b9baa17430c48fa50c3873486e5349d06039a0dc08438c038477cd1e288d9c7d53ce3057f85d42decfac80ad6195561e783b4ee22407ea43201a7e907c6f64d310d107076daaa01b38b716b54f26203093a6be997ee8cd6ba0a480188582c730c72911219546c72e2f9e2ed886761daa35a5a8ab176ee1f9ff0f2fc8515cfcc145d29ce49bf8bb7787f3daa9c928edf2f0e7a15b7fe48e62b43cc685031f9f2215802ba5a1055b68188c1474e1709be28ba5940a207572777c127d1e83785a4a64f81c0c8f6a1c3bd249e3e0a3a9931bfccd1512eab00b81eae91667bae528a3b388bb6c1db28d91f57590e9175c4c3c07608a1bc87708175f110248663b796cfe2afdddfd3febd8aa63f3424a1fd9b8ecbeb565f4286c8b5236d803e560174b53c31df17a5df25bdaf630e01a025a995634792c7b17890b0bbc42c86b85377d8f45436d617ecee6294c78e356daa6a73e7237f2addc704c8ad15d729e6a628a0fc6dca2d2816c1482d15669a0f1da10d3796e97dc5ad460b8d502db99e5bba038760b383f5e69aef4da8f7dc2631234f92eb2fffcbec8e71a29735f083dcbd601b2a0d75706361f72dca9137407c12dc0384757583ead366c2dd00dc0dd0f1b261980f301d515a4b9f97aa64efc8339d95fb7ecbf72d260c21621bf74252e5e5737b10882f6fd2137509544"},{"member":"sfxe.07","offset":"048074","after":"8a72053a23a74d05506ecd33f58163ce0173e542c3e18bbd1bd2ef9af325589ecba5ed53d10eb27e32cecbe2a48e519d056706d91f644da866ecf7c1ecdcbdd4c86e06e34e5ebd98b019a5a2969301ab444ef89c10016e02386f87"},{"member":"sfxe.07","offset":"0480d0","after":"f941f6f4b697133dbb07e7ed2af47f707c8de30bc583c99249d8fa4db4f310ce984dfb4e1d6ef4067d9003ee633c5b122004391f3d02"},{"member":"sfxe.07","offset":"048107","after":"944ec35e74ac57c37135a3ff22e0ed8f92d673bcd49d101fc9efd694500ab1984e36f99e596c5da72fc9c4c7b0749e33e210d829e6a506672e61295c8f12318ef119da77861bd971ac90cd32bd9d1d589bebd8e7ac519c6833f089bff6f8bb4a798526e99af1b4e415ba0ec2234a7651ca285644c614533d9f0d40f6744427d49d4aec3abc34755a809e64af77b38d532f1c1a2dc799d93ded15fea075fce9836346893f1866875d4b1e44906a8b162d1d8ed6f574292de3d4f00f3e6899e352c90a4ad53b303bebd0f451dce52cf12b8b4f77484b98da40d4d87b458b4e3214449f0233396fa23c32b3593d84a2d2df751616a557"},{"member":"sfxe.07","offset":"0481fd","after":"2d1108c54a94e87fb1ad5ad5"},{"member":"sfxe.07","offset":"04820a","after":"1cd91c72475e82dc0aeda90d882317abc8a1db5e2ddf8cfb06c5093cb53e9ba45a50070a016aae4c33642c2d68d5e635c02069f883ae36a92cf162de57219e4bd72b38d4e4d177ad5f831aea9a753c218f3c7fc36c39e09c04eae6f59efdc2585472eded48b1736dbcc4520acebcca13467a337ba637e1f1abdf4fb7e5de888a78261132a9088583b76647d3fc6f0a04899746acdaa659df0faeff9b556062f471cdcd406c8e3a71cead621ffce6440467cef7776ed93414b2de7f2a4d18bcbac35d91d5c0541ece83f09953fde7e9c865065e40897f59aba2d183b8b9b46e19a6db1a336289533ca727d891286b85d3527f1505f88768380a2bddf4cf4c0c9cbf388e699d33c713094352e0159d0834df4e54496b3af5e68742850cc73b381e9128514d916307ecf9792f91ee1a27fd8fa0694b8f75b7299c26d0571c06384ba6dfb328b48f423067ca7c4b0aecdc0ec30187de19dce6f61c3e386b7af40488a01b2b39f60efb4b24918e4474298606651318d5d0fecbca86b6c2a9b662e6aa90115ad42a88478bcc8a117bb3ce9b5eb910f751ba71dabd23a86a94f007a99da97e394ace0cef4f14dde7bb4b04eac001dfd16ca26149b722cf94759913cd638bc7f6b7c01abfa844a2bf9c22b91bc9157743df44d366c36de6f025f588bb0832fb8e782dd5c8bd81aadd7350f0ff24edad2bb8e0f4d890d0fb1ee709d61f1266a337a9f5a37122384d32ac2084c5d4d53b5fb27ebe1e6e842d8a5b4477df9edf7806286c119a19cee4849b561717aa6e08540808420616f6758ee86c7d0c79fcd6ee493305f01daa3761f670e587827c7be83d87640448264723486d6b06cc25bc3151a397189b36e05d78a26045171c16ab826428d0dfe786f01c10be8e98a2df87f7b421ebb9677a4cc838cc5cca2175a158b542bc09bf212a489c824820bf473973b357ff0510866310835660b8d22f2c6167a612864ff8e47814b18592368edf610149bf013dc8d2804a77e834f33168c555d0956a2439c55591ece8da8f35652a95f9f59680a21c2a9905693ded0f641ab3eff94d7bd06d80bf0b285df9be19f73a18612d181b18fd8f42d319045e754a9559987fd00bb8e25f5c184698db3198e99c1ca66a02ec778c6f836cd5eadb577bcb08e9556413c2066180a1a36226a2fe94d246393a0bdfff3beacb957ad9985b7d07411b80467f1b620ea7fb89c4ca085187075bed0adf0a67cfe240e80c3d2e8d9a99dca8b083ac1b658c423dd342e88ea4fe77a7965ef5e71049f4fea490f7862eaf126df152fc6075fe9558b36466c5ee40f52afe797dd54907796d03d32a6d88db0a673ce3b50719b0d9697a0d999758448a6e811ee848ba439cf536c304d149b62b8156600fcc1fae"},{"member":"sfxe.07","offset":"048874","after":"ddfbb79e855bf615d62031475f6eeb82b8241be29e28023c35f0773011c1130fc2582e5f047d50e39f6932166478d70f1f8fb43b8f2337ba92fa6437597e0e7252208b4f75dc3a3d"},{"member":"sfxe.07","offset":"0488bd","after":"e35afe0fda87d86f8d520c4d24eb7181f0bbba0ea757863a674e5d94e6897fcc630de403ac70a045"},{"member":"sfxe.07","offset":"0488e6","after":"326469bfe95f70b9326120db16b0721278e2e6d9566fc0298b673152214a7c54a9b4e4c4344c1f60ce"},{"member":"sfxe.07","offset":"048910","after":"fb046b2e5dd9436cdd35d9320c4b9ee9b93cf1f91fc4711e577ad2854578bbe8215269a5012d2f166dd585c810dbbf3322603e1f49f9e5188caab5c27fca1c44a987a560386f057199ffc790a546f511b434c74fcdcbb3a8a2f73a5206f4ac8d62bdc9bb6637f323c63accf2597cd9ee06534464e3461b57e7ecbebec72afc17eeddb79eb5dbf3fb4bbd29363a766d35db6efd18ef76315118595c30b6412eb9c33ed1bd07d8ae727adb5bef520ae496a76b0fffade32f222fe5d809505d550161bcbdb5a04524cc839ede4abc1f4a324d37ccbbfdeaa0fb292c07bfce2be303fb8b8a3bd8c727e2c776c7f096404a140f5416db6f5c23480ed8c024ccfd72aa4afde56e5bf2eb40d0d5e243130537e3ffe80933aa3e44177f5c2c4c1e4356bbd026f85caaa704b2956d057cfec5f5f8fce5a9040a1fd34cdb15a45b656965a183184ef6f7d215fd49421a9288fde06a3074ac3dd2abe33862b83309a20232c9ebd0d450e1c49f329aa8187128db08341bab1e3c69dfca3d7ea2a281af5a5a156b9add07ad1f07375da42965f8291318376050ad387a5f2ff9bdc321fbd83bc29e47a6c92240f2b671b6d7a560acabc7c364619df87a02972e1e590cc2d32f4785369c5abaa7a6b3b44991dbb599685d3acaa29ca555d8f7422195fc6063cf5be596455f14bc7e2a736d5d7ba4f66dee9dbfceaa804aba70e8ed8e1e62ec25bf3033fdfa54c743fc8879e031e936543de8769f9a5eb2bbb5f5f504f11be55673be3ae0827e51c4bfebce87f8e99785d8bb2c0b5816ee555085c3699c06cef5cc56d2069748ffabd3d89bc8a9a8768b34a5f2f873b59c2e2be994c6c98e69e329ece48bf0060d501abb60f8455e63987ed10305207ac4a4069cdc7b5bdbc029f8025349051f3f92c2f1f1a5a0bcac5b3ae14e7cdd02c763493513f33d372fc55e9d3f663d2f63c22d0e"},{"member":"sfxe.07","offset":"048bba","after":"913e8304d995ddf1b592f969dcade525891d91b710c5b8ff28fe5e572c7bb633e71bd02c37a3556319a73c6a0bbcd40d5252a55928399ff0ff369d3014d5969d85b19e6bca8d5e26bd2898c113e028c7473e6f715658b45e83b21dc46db19b0f3bebadd5b02f4d72f35191c922f79b8635fa9b37b8f6e5d4d4055ceac1a8684e6844c688466a0db338430e337e8ccafcb62fb6e7e4404cd9f2a2208c46525e84e3dd981df60d2dca07b8a6b58564a85c6fba2d68ea61fa591bfe676033b4ff40318b9dec0f992359d4ceab1ecd26541f4d0a26a4e75ee39c7c07714b0f0561a69368d4541330480e3a478f1b40aab4600eb497105d57b0fec7ff4ddd7ea3aa315d23423c51941d44db776053bae3d9cf44639598aa2c0e1c5806c9db8832928b9d3eb2fcd79760477fa18263b0feeaaea0c830b073b2985b75011d95cf4dc7383f18b34cfb2b136491e8bc3fe5e187be3fc63d17ff75a7918877cc71b14998e071b1d14796c7bf080b23bfda8d6be02a2ac26e35eab15467ba9b9ded2baad2ea847715e625a16ef91d6ad4f2be3387de6438308c85d3e9"},{"member":"sfxe.07","offset":"048d52","after":"12619f7c9bba580434b5ee65189acb89c1df31ae44e1c238"},{"member":"sfxe.07","offset":"048d6b","after":"3f3084d7d11e13bfc1fe118405d61425cdbe2ef814d8d2ed39f7e1e2895dd6d1922b7235ed2805cfb3b87410ed992a8efa4f1380ad4e0f3226d42e833869c4a42c025e8c65dff89c34cf558ea1d31e1439d48af413e213cf822aab9e49a8952aa6a8890648732097d96418030d845ef2891aab92fdd7c7dbb2"},{"member":"sfxe.07","offset":"049074","after":"10"},{"member":"sfxe.07","offset":"049076","after":"20"},{"member":"sfxe.07","offset":"049078","after":"40"},{"member":"sfxe.07","offset":"04907b","after":"01"},{"member":"sfxe.07","offset":"04907d","after":"02"},{"member":"sfxe.07","offset":"04907f","after":"0440"},{"member":"sfxe.07","offset":"049082","after":"20"},{"member":"sfxe.07","offset":"049084","after":"24"},{"member":"sfxe.07","offset":"049086","after":"449124"},{"member":"sfxe.07","offset":"04908a","after":"449124"},{"member":"sfxe.07","offset":"04908e","after":"449124"},{"member":"sfxe.07","offset":"049092","after":"449124"},{"member":"sfxe.07","offset":"049096","after":"449124"},{"member":"sfxe.07","offset":"04909a","after":"5c9124"},{"member":"sfxe.07","offset":"04909e","after":"5c9124"},{"member":"sfxe.07","offset":"0490a2","after":"5c9124"},{"member":"sfxe.07","offset":"0490a6","after":"789124"},{"member":"sfxe.07","offset":"0490aa","after":"789124"},{"member":"sfxe.07","offset":"0490ae","after":"789124"},{"member":"sfxe.07","offset":"0490b2","after":"a09124"},{"member":"sfxe.07","offset":"0490b6","after":"4c9124"},{"member":"sfxe.07","offset":"0490ba","after":"449124"},{"member":"sfxe.07","offset":"0490be","after":"5c9124"},{"member":"sfxe.07","offset":"0490c2","after":"789124"},{"member":"sfxe.07","offset":"0490c6","after":"449124"},{"member":"sfxe.07","offset":"0490ca","after":"449124"},{"member":"sfxe.07","offset":"0490ce","after":"449124"},{"member":"sfxe.07","offset":"0490d2","after":"5c9124"},{"member":"sfxe.07","offset":"0490d6","after":"5c9124"},{"member":"sfxe.07","offset":"0490da","after":"789124"},{"member":"sfxe.07","offset":"0490de","after":"789124"},{"member":"sfxe.07","offset":"0490e2","after":"c09124"},{"member":"sfxe.07","offset":"0490e6","after":"c09124"},{"member":"sfxe.07","offset":"0490ea","after":"8c9124"},{"member":"sfxe.07","offset":"0490ee","after":"a09124"},{"member":"sfxe.07","offset":"0490f2","after":"cc9124"},{"member":"sfxe.07","offset":"0490f6","after":"cc9124"},{"member":"sfxe.07","offset":"0490fa","after":"4c9124"},{"member":"sfxe.07","offset":"0490fe","after":"549124"},{"member":"sfxe.07","offset":"049102","after":"449124"},{"member":"sfxe.07","offset":"049106","after":"cc9124"},{"member":"sfxe.07","offset":"04910a","after":"cc9124"},{"member":"sfxe.07","offset":"04910e","after":"cc9124"},{"member":"sfxe.07","offset":"049112","after":"cc9124"},{"member":"sfxe.07","offset":"049116","after":"d89124"},{"member":"sfxe.07","offset":"04911a","after":"d89124"},{"member":"sfxe.07","offset":"04911e","after":"d89124"},{"member":"sfxe.07","offset":"049122","after":"e49124"},{"member":"sfxe.07","offset":"049126","after":"8c9124"},{"member":"sfxe.07","offset":"04912a","after":"8c9124"},{"member":"sfxe.07","offset":"04912e","after":"a09124"},{"member":"sfxe.07","offset":"049132","after":"549124"},{"member":"sfxe.07","offset":"049136","after":"549124"},{"member":"sfxe.07","offset":"04913a","after":"c09124"},{"member":"sfxe.07","offset":"04913e","after":"6c9124"},{"member":"sfxe.07","offset":"049142","after":"cc9101"},{"member":"sfxe.07","offset":"049146","after":"12"},{"member":"sfxe.07","offset":"04914e","after":"0c"},{"member":"sfxe.07","offset":"049154","after":"02"},{"member":"sfxe.07","offset":"049156","after":"14"},{"member":"sfxe.07","offset":"04915c","after":"09"},{"member":"sfxe.07","offset":"04915e","after":"04"},{"member":"sfxe.07","offset":"049162","after":"1a"},{"member":"sfxe.07","offset":"049165","after":"8003"},{"member":"sfxe.07","offset":"04916c","after":"0a"},{"member":"sfxe.07","offset":"04916e","after":"04"},{"member":"sfxe.07","offset":"049172","after":"1e"},{"member":"sfxe.07","offset":"049178","after":"04"},{"member":"sfxe.07","offset":"04917a","after":"02"},{"member":"sfxe.07","offset":"04917c","after":"05"},{"member":"sfxe.07","offset":"04917e","after":"02"},{"member":"sfxe.07","offset":"049180","after":"018003"},{"member":"sfxe.07","offset":"049186","after":"0e"},{"member":"sfxe.07","offset":"04918c","after":"01"},{"member":"sfxe.07","offset":"04918e","after":"02"},{"member":"sfxe.07","offset":"049190","after":"04"},{"member":"sfxe.07","offset":"049192","after":"02"},{"member":"sfxe.07","offset":"049194","after":"058003"},{"member":"sfxe.07","offset":"04919a","after":"14"},{"member":"sfxe.07","offset":"0491a0","after":"04"},{"member":"sfxe.07","offset":"0491a2","after":"02"},{"member":"sfxe.07","offset":"0491a4","after":"05"},{"member":"sfxe.07","offset":"0491a6","after":"02"},{"member":"sfxe.07","offset":"0491a8","after":"01"},{"member":"sfxe.07","offset":"0491aa","after":"02"},{"member":"sfxe.07","offset":"0491ac","after":"04"},{"member":"sfxe.07","offset":"0491ae","after":"02"},{"member":"sfxe.07","offset":"0491b0","after":"05"},{"member":"sfxe.07","offset":"0491b2","after":"02"},{"member":"sfxe.07","offset":"0491b4","after":"018004"},{"member":"sfxe.07","offset":"0491ba","after":"1e"},{"member":"sfxe.07","offset":"0491c0","after":"048004"},{"member":"sfxe.07","offset":"0491c4","after":"04"},{"member":"sfxe.07","offset":"0491c6","after":"0c"},{"member":"sfxe.07","offset":"0491cd","after":"8004"},{"member":"sfxe.07","offset":"0491d2","after":"06"},{"member":"sfxe.07","offset":"0491d8","after":"048004"},{"member":"sfxe.07","offset":"0491dc","after":"04"},{"member":"sfxe.07","offset":"0491de","after":"06"},{"member":"sfxe.07","offset":"0491e4","after":"01"},{"member":"sfxe.07","offset":"0491e6","after":"03"},{"member":"sfxe.07","offset":"0491e8","after":"41"},{"member":"sfxe.07","offset":"0491ea","after":"04"},{"member":"sfxe.07","offset":"0491ee","after":"0a"},{"member":"sfxe.07","offset":"0491f4","after":"ad575b3b5f4316cdbe131e563fd47dca03afbb8aceae0d3e4ca168ff3f4c02b1ebec5e58556b870a29a9034538c75b7107c450f9a8a256829d3eb60bccf0a0127d20e5c26956c67cfee584d9bcec9de601b44e29f8ba7a92e430e904e2e7170fb4e01d285e27f5103dcd9055502f0ad3e8e5be1b07b83baae9e48c3fc4ff343134ad6c9fe90dfeb1d6f5de1a160cd89345972f0858f133f62938be98cecb7deec346177ff38a2f9c50877f7695b9ed3f6117a4db7ff0791813a490b454612adc8993af396e8e66785536e581ed8dab367dbf1b494ce51db4b8c78270dc1e0b73a4a5b0339078ef1ebe7f2fbcb45b5cbb4fda39144c9de5d037e607dd8a4de46d50e7dc7a82385b793d031a4f956a831e862f1c33fb8c429ccbbf1cb337d4ea2cdd7bcfd6adf3232ab0b6f3a66be114aae250b833b721899a1365e72819510e04223d5c1dd95cb21ee911b843cc843ba9d08a010a527dcd79997f4cc888535a810eda7e3747bfc586a3422ca4c93598993677fde19c38ec7d503dff07d1a6c4102f9505b57aa19770c7a24648c1d97c0568e6537036edb178c590c6258bce569f8a66c10f46692ccd97460dcd2da0baa126e051969f760dbccd36dcf690a8804f194bde9ce26157eb4e3baaafcd95809df263a6fe1bb6ff9e49d0e780c80949fd6147417f03f0596f765e07044499fb3238234750d6e9f9d3f4e6c730fb0665a9d72e23a422f711bc407f0760a01135ac3e7cd317a09c4ab15beed1e76c53d9cf397a5d03569ce078fdd6736db87eed440d1dbf34bfb66b8ab34d146c91d1492ea3a8fbcbf480b2e26f5e08c36d0df8070d3acd32fb0eac5465e2bf69bb2740e6505565cd4d1257545ea102682317606bce51"},{"member":"sfxe.07","offset":"049467","after":"d7972de53085aa74f09cad7c7c830d3a5fc9e6122022b88828c13d1c42b0d4d3f3f171c38c3b7a115929d4d38cf8e56fe99d17dd2099e8504d56203b26966d0762abb7125f48555251acc22a35ce0d72af1cfd09e82eba3f7b5d229bab6dc851c4acf32bbaac6528f8969a255c1134b3353ad2df997e0a627693371bada4b9457dfe21f7f48d64deb5364880cf57f41eb0f2a5511df0232b13718b1b2a0582798a91b92468eb74cfa50f8f9976acbf4c644157304228114b8ab7057602297acbbe11c96b6e59c6d705f2ddf714fb1ae65c7fc337e30e50234a011449aea94320ac817851da7657e84b52da699d8592c2f695de603c23d2455ba8fbfb4b708afd1565be2766f83fb4bc5a9c09c8d6ddd5858e5f01e7a5902364d2b9b13d7f8237757693220169f7f2f4679a6f4166bda2aa9cc3b0c673f1ad53e9b1bb7ad9f5a52b1117c24d7bd91bd20da85e0b72d555891de86cd2c50fe358449c2abdc031b11601c9ca632996c6af2a4b600f110f280f2a0f1d0f1f0e1f0b1f062f011f061f0b1f0e1d0f2a0f280f110f"},{"member":"sfxe.07","offset":"049874","after":"51b976cd35af45c2bebf6f683de2e04431ec84e5840a57a50658557cb46e0e69700cc9b5465f360277e304650b524b85d5617b595413d50e3166eee6434ec78bb5172fc7c7937c"},{"member":"sfxe.07","offset":"0498bc","after":"4bb924ac8d5b5cd97a75c7b87a730de1ca2871b54869c96e5f998996a7b878347f32be911d344b43296ab64113b0f6a28907c1ea6f6d4f63df58522d7014c0dcc7d8e3db01e07fc1f3658101aa1dcb782654b6ca106de929cff26cb0f19f152fe714052552ca3ed9cd5437064d422cf0021d78a8d3be74677baa71cc43e8883e8cdd1ff73ee7cd2c2e91aa42d52671edf00fbfac50f98737aa122edab0f9d23c824be07833c7b5c9795398f1f90b7edddeea5b34f38cd52348fff3b710168d2782c4717c139e0c4575abcfe34f811abcaa33572642bc3f6a0d7821eebf8d80692bb0a9c79391686e8c2101c8cc2fc62fe2944f30a02788755a96cec3ce9c4686a7c1c4f2763d6850b58e5ceccbf6e199a19f09fa9d9946b0e7e4641a69a4d3238f5e92cbe86a0fcb676fb66b60c175fcf59557668e08236bf8d719a11ebb8560540d0b216e8850acc76738f32d3b5af67745783a572d758e50a2acfaadad0766c031bb57489ae37888becdfcf6b184039b52ec35acc25ac1923dd3298fe5e59637bbdbba9550cfec8e683a555981f03d7eb9573c284d0250c04c69583d0da5786cdf0846712378377965b18ccdbc42c8886af6f3398cfab08bc7952d3686639ceb129f0a73b7d5355e3159f8482bdbf58e511b84e0fc43ef6941463a13aaccd313de1031fb51ed2ed6ef3f0d514bb1eb337abb65475623eb04b7b066f36e901ba3c6823228bcc8e81cdd83b5"},{"member":"sfxe.07","offset":"049ac9","after":"5aa5235972c26d22e02a24fad37e44d04e875fac6a17f0ecd67eee03ed2abe54033aacb9c8437cb1e2eadb9716ea811d10e2a5fae2eee8c7f6fcd16cc531e26d2db3ac267026d712334618095cac29538403e7e6e88827d28fb4bcbfc4f07aa053b879ac90d9b73932512588dc513aa82b0192a274671e3caf140d29b3a3b9fa0fb12e876a77b269e306fd7334c8fb9d8c613e19fd35e8bfaa8edefd748aac596b3dde7f8295386287edabb8095d23b5cb4b03c5943b2b6d5546a8773cc663"},{"member":"sfxe.07","offset":"049b89","after":"b85dfd36c2cab4a5722f112bbe40c3db4ebd189aace0d4ff364e02e60b0ec071b5d3c0467f03839611ef0795cd6179535fa57f3cd440715b1dc9d07f13a855e67c63a2574fb33538ab6ba5bb606d4bf9f0f42f1ba938c2cddd25157bafc2ed280dfd57351f85821e1683b272ac2336baf2f336ee697daf285dfb14a3e9094158c56a29a82dfbfc33339fd60c08b9cb79bda4bddaf994a1413da00b3d09a72af4267faede179b3e3da025a385ae66ec679e48702425308c96ae5ad7940fccd4ff69f378c8796215e93a3242abd9b8eeacad46f1a479240af8543ff0c3bd31584589a6d2e3a1d360a26b447ec0b9d4d3a77f9f3a3a8d82585dcd78b31fd5eb8217f9c036b633907e4bc4b7e0583e9391f90efc2b726307f659bbd5760384dc581542b3f0873a5c394ac09f6c44a0eda06feb922858462046aeae2714ad4d9ed6c22dd9d5267a3b4fa0dca9215902f5ffd3a55359dfa21ddecf8e05dc7488e1b871fdbbfafbd3d06db2b0b6d58ae1c48fae5dd72a6e2dce5b5a901cf31117d1fac2f0c59a67c471c4a426e5bd519898072338"},{"member":"sfxe.07","offset":"049d1b","after":"d61516aea81b92bf71190f57698cfa87fa6507202ea8941f68605ed48592d6761cce50"},{"member":"sfxe.07","offset":"049d3f","after":"0b5d6ffff0c2f82d"},{"member":"sfxe.07","offset":"049d48","after":"75c1e689ed5c8fa0cddd037df8f7c6d8585f630e315eab694e889628a0722d81fba9cec72eccd93ce6e930fd405b11e4de95613ea34f1039d3361ad2d2e2da94a8eeb2a9ca99c1e78aba5d7f0f5c35b190f01ef4454ec1ff4e20fbc5f56eff36c0c311ebd10cea82ddebde1684fee710d8edae7434782178a61eab0a17de15744caaffc7a1f7a36cc7574815a9e61859433ae05c0aa66880c6c484a2905df784cfb7e47a59261c2559ae6372"},{"member":"sfxe.07","offset":"04a074","after":"7cb25cbf805cd7a75d6dfc94d7d3e3696f664b6f139db8dd75a170dff02643b7431e2b697e191fb5ec377427cf"},{"member":"sfxe.07","offset":"04a0a2","after":"37bf17a43114af53acd70fb502883fcbce2e349cf164b22e9535eb99062453ca5a012dd25222137a1b8217a1550da9930793a4051de4349a7d05a17118e862088e0338d18c09ec6821e2aa341a3d5926d68ee29c21b8e7b7f16ef5ca3dc55bb8e6a7ba197fed50d7e994075b637373594ca7e879eb239f1657f46ec3f8570cf29826d78268446a7614d679e3cf314b76f43db4e95cb6569907def7ef354fe4537a7d11d37368841677e3a4de8782f76760f36f054b5ad1dc6cef4681e4d935292885752eb534fc1a4f6cd236158b73ec2cd185bc0c0ada1c2f2d789430ba11ee3c4afaa830778a541fcaadc5a2cd44f8fa056a8f3a09b15d1cb05db0e50144b8e2a112653776bbe43a7e989d2c5e2fe6e926d8fbffc60aadf59a625cec46661c04c802d42605394cc731d6c6d9c63606d4be9563043f1e8c3428042ce9ef4588bc8ffc384ba88ffee537d6dc8db1d202e1bd84308f51f7f65ec4f8a2b79f73d53bb18cc1ca9722e985b557d0e7b049d3f8aae1eade0bde739e8d9254edd4e6302a83b708ef42eea60120d85ee76059b7a7b259d61992185129"},{"member":"sfxe.07","offset":"04a23c","after":"94da3d9e645d9b9af81d3934b9934fc7cda831cd98cda634cbd221cf0df11058"},{"member":"sfxe.07","offset":"04a25d","after":"72482eaf13878f99d465183591f3fee4514530b2e90f86a1ecec0c01755927c9f1b7b66506073206e060b22f2d01"},{"member":"sfxe.07","offset":"04a28c","after":"030209080b0a070f0e06040c0d05"},{"member":"sfxe.07","offset":"04a29e","after":"5c830a"},{"member":"sfxe.07","offset":"04a2a4","after":"10"},{"member":"sfxe.07","offset":"04a2a6","after":"6c830a"},{"member":"sfxe.07","offset":"04a2ac","after":"20"},{"member":"sfxe.07","offset":"04a2ae","after":"7c830a"},{"member":"sfxe.07","offset":"04a2b2","after":"10"},{"member":"sfxe.07","offset":"04a2b6","after":"5d830a"},{"member":"sfxe.07","offset":"04a2ba","after":"10"},{"member":"sfxe.07","offset":"04a2bc","after":"10"},{"member":"sfxe.07","offset":"04a2be","after":"6d830a"},{"member":"sfxe.07","offset":"04a2c2","after":"10"},{"member":"sfxe.07","offset":"04a2c4","after":"20"},{"member":"sfxe.07","offset":"04a2c6","after":"7c832a"},{"member":"sfxe.07","offset":"04a2ce","after":"875c0a"},{"member":"sfxe.07","offset":"04a2d4","after":"10"},{"member":"sfxe.07","offset":"04a2d6","after":"d95b0a"},{"member":"sfxe.07","offset":"04a2dc","after":"20"},{"member":"sfxe.07","offset":"04a2de","after":"745c0a"},{"member":"sfxe.07","offset":"04a2e2","after":"10"},{"member":"sfxe.07","offset":"04a2e6","after":"875c2a"},{"member":"sfxe.07","offset":"04a2ea","after":"10"},{"member":"sfxe.07","offset":"04a2ec","after":"10"},{"member":"sfxe.07","offset":"04a2ee","after":"ef5b0a"},{"member":"sfxe.07","offset":"04a2f2","after":"10"},{"member":"sfxe.07","offset":"04a2f4","after":"20"},{"member":"sfxe.07","offset":"04a2f6","after":"ff5b0a"},{"member":"sfxe.07","offset":"04a2fa","after":"dcd56208895d843dbb6a211b4ae08b0b8959070d58068203f52a633ebbd822731dc2127ff6838ac4e3230d1825acbd918337b58335a98ce841298c60e226231278ed81caba31bdefe48717d1e44cc57c8db81c8e138908e2d5a055a509e9961674ec5c4f93429e315303233f6403b9ed76aef69b4bc48b643274c93701a9cff2b9b825777b39209a23dcd07204acceb8d4201fa5f1693e19811aae47be3fef16356dd633c590bbc8a0622b901cb1d36cd8f5238cfa8c2c4d64616d90a5e86ceb1539d1988539c5d1b379fcb6ed388ee9bd33564c2734b1ff646a"},{"member":"sfxe.07","offset":"04a3d5","after":"0f110f220f330f440f550f660f770f970f770f660f550f440f330f220f110f"},{"member":"sfxe.07","offset":"04a3f5","after":"0a110a220b330b330b440c440c550c650c550c440c440c330b330b220b110a4954454d01"},{"member":"sfxe.07","offset":"04a41a","after":"0201030304040605070608080909930b620830"},{"member":"sfxe.07","offset":"04a42e","after":"a202b303c404d505e606f808fb0b3a1365ebc933f8b355c8ba0d4116adbb22d56be99e5330a1f7d1836a60a845aa6aa7e16e67eaf42fd73d2569b0966fc769ee19dc1d0743bb112b901b1959fa71c59451bb960c585d0a2b8dff91805ffe61b555d10821145e9fa7f8bce6aae3273a9447fb8a52ce3c316a399f22223761534c8132a9eca6bb7de44f81bb6cb39dc60b116513e067360ec7cec09f7a36681c8462cba1875b9f9b1911e7b247f544f0a9bae4f139a09c5bb2b8808cdc103285b6da30684a6c3240b85bb34abbeccc2ba7040d08d6fb85dfb675b23e85f138225ecb"},{"member":"sfxe.07","offset":"04a510","after":"2437c2c9e331f5038dc730f557de"},{"member":"sfxe.07","offset":"04a51f","after":"60a1c6823608779fe5f652eda83ed7d8629a94027315331eb99db9ed606d48bf19aad30c393545e23b27e8b9d1d458e82e29eb936eab5f760929653173ab3b20994ffe366e034606122f86cc471eba80ffbbac2fad25d60357792f"}],"fingerprint":"a9556acf171659e3d51dfbf5b4037a5416a81b0e7b2297255ed6d12a11b7db02","output":"ssf2t4p.zip","build":{"payloadBytes":13880,"hooks":31,"sections":44,"defs":{"DUO":"1","FOUR":"1"}},"knownOutputs":{"e26be1d26438481ac34a5b743c5f9d0d921eeb0e449fc26709b0bfc90b1f5c00":{"release":"SSF2T Crossover v1","member":"sfxe.03c"},"c1e240dd68d32d22de83a098e474242fe2ca8040493125d0c025554edb88a1fc":{"release":"SSF2T Crossover v1.1","member":"sfxe.04a"},"187cf70fff3dfbf0d45dc23900edb6453fef4103a76ace82eb59e96221f7324f":{"release":"SSF2T Crossover v1","member":"sfxe.07"},"cac2071c37124be8c97d425ea134670b05780d52a79211397c466392c4f90d8a":{"release":"SSF2T Crossover v1.1","member":"sfxe.03c"},"9fd6af48a42894e92e7d4123f26a730b45d0d30e0c4b689d9dc8b5fe94efe302":{"release":"SSF2T Crossover v1.1","member":"sfxe.07"},"1ffa125084383ad9bbc2d8d798f227c836f066950f4bfaf8db4082e427d70e2e":{"release":"SSF2T TAG v2 two-player","member":"sfxe.03c"},"f08040bd3315ef7a50f0bf1970261a56c1c2464886e544d122e76001db5f91ea":{"release":"SSF2T TAG v2 two-player","member":"sfxe.04a"},"3f651b58d0bd56ae72eb2e4fcc4e6c3f01d882bb74509451aba36fa464052fd8":{"release":"SSF2T TAG v2 two-player","member":"sfxe.07"}},"variant":"4p"}
'@
$Spec = $SpecJson | ConvertFrom-Json

function Wait-IfConsole {
    if ($Host.Name -eq 'ConsoleHost' -and -not $env:SSF2T_CROSSOVER_NOPAUSE) {
        try { Read-Host '  Press Enter to close' | Out-Null } catch {}
    }
}

function Stop-Refused([string]$Message, [int]$Code = 1) {
    Write-Host ''
    Write-Host "  ERROR: $Message" -ForegroundColor Red
    Write-Host '  Nothing was written.'
    Write-Host ''
    Wait-IfConsole
    exit $Code
}

function Get-Sha256Hex([byte[]]$Bytes) {
    $H = [System.Security.Cryptography.SHA256]::Create()
    try { return ([BitConverter]::ToString($H.ComputeHash($Bytes))).Replace('-', '').ToLowerInvariant() }
    finally { $H.Dispose() }
}

function Get-FileSha256Hex([string]$Path) {
    return Get-Sha256Hex ([IO.File]::ReadAllBytes($Path))
}

function ConvertFrom-HexString([string]$Hex) {
    $N = $Hex.Length / 2
    $B = New-Object byte[] $N
    for ($i = 0; $i -lt $N; $i++) { $B[$i] = [Convert]::ToByte($Hex.Substring(2 * $i, 2), 16) }
    return ,$B
}

function Get-Fingerprint($Patches) {
    $Sb = New-Object System.Text.StringBuilder
    foreach ($P in $Patches) {
        [void]$Sb.Append(('{0}|{1:x6}|{2}' -f $P.member, [Convert]::ToInt32($P.offset, 16), $P.after))
        [void]$Sb.Append("`n")
    }
    return Get-Sha256Hex ([Text.Encoding]::ASCII.GetBytes($Sb.ToString()))
}

function Read-FlatZip([string]$Path) {
    $Members = New-Object 'System.Collections.Generic.Dictionary[string,byte[]]'
    $Order = New-Object 'System.Collections.Generic.List[object]'
    try { $Zip = [System.IO.Compression.ZipFile]::OpenRead($Path) }
    catch { Stop-Refused "not a readable ZIP archive: $Path" }
    try {
        foreach ($E in $Zip.Entries) {
            if ($E.FullName.EndsWith('/') -or $E.FullName.Contains('/') -or $E.FullName.Contains('\')) {
                Stop-Refused "the archive contains a folder entry '$($E.FullName)'; use a flat ROM ZIP."
            }
            if ($Members.ContainsKey($E.FullName)) { Stop-Refused "the archive has a duplicate member: $($E.FullName)" }
            $S = $E.Open()
            try {
                $Ms = New-Object IO.MemoryStream
                $S.CopyTo($Ms)
                $Members[$E.FullName] = $Ms.ToArray()
            } finally { $S.Dispose() }
            $Order.Add([pscustomobject]@{ Name = $E.FullName; Time = $E.LastWriteTime })
        }
    } finally { $Zip.Dispose() }
    return @{ Members = $Members; Order = $Order }
}

Write-Host ''
Write-Host "  $($Spec.release) $($Spec.version) (preview)"
Write-Host ('  ' + ('=' * 64))
Write-Host '  The clean input is only read. A new patched ZIP is written.'

if ((Get-Fingerprint $Spec.patches) -ne $Spec.fingerprint) { Stop-Refused 'this installer is damaged (its patch fingerprint does not match).' 8 }

$Src = $env:ROMPATH
if (-not $Src) {
    $Guess = Join-Path $env:SELFDIR 'ssf2t.zip'
    if (Test-Path -LiteralPath $Guess -PathType Leaf) { $Src = $Guess }
    else { Stop-Refused 'drag your clean ssf2t.zip onto this file, or put this file beside ssf2t.zip and double-click it.' }
}
if (-not (Test-Path -LiteralPath $Src -PathType Leaf)) { Stop-Refused "file not found: $Src" }
$Src = (Resolve-Path -LiteralPath $Src).ProviderPath

$In = Read-FlatZip $Src
$M = $In.Members
$Known = $Spec.members
$KeyName = $Spec.key.name

if (-not $M.ContainsKey($Spec.detect)) {
    foreach ($P in $Spec.otherSets.PSObject.Properties) {
        if ($M.ContainsKey($P.Name)) { Stop-Refused "this ZIP is $($P.Value). This installer takes ssf2t.zip ($($Spec.title))." }
    }
    Stop-Refused "no Super Street Fighter II Turbo program ROM ($($Spec.detect)) in this ZIP. This installer takes ssf2t.zip ($($Spec.title)), as Fightcade 2 ships it."
}
$Unknown = @($M.Keys | Where-Object { $_ -ne $KeyName -and -not ($Known.PSObject.Properties.Name -contains $_) } | Sort-Object)
if ($Unknown.Count -gt 0) { Stop-Refused ("the ZIP holds files that are not part of ssf2t: " + ($Unknown -join ', ') + '. Use a clean ssf2t.zip.') }
foreach ($N in @($M.Keys | Sort-Object)) {
    if ($N -eq $KeyName) { continue }
    if ((Get-Sha256Hex $M[$N]) -ne $Known.$N.sha256) {
        $H = Get-Sha256Hex $M[$N]
        $Prev = $null
        if ($Spec.PSObject.Properties.Name -contains 'knownOutputs') { $Prev = $Spec.knownOutputs.$H }
        if ($Prev) { Stop-Refused "this ZIP is already patched: its $N is the $($Prev.release) output. Patch your clean ssf2t.zip instead: the backup you kept of the original." }
        Stop-Refused "$N is not the clean $($Spec.title) ROM (it was changed or is from another version). Use a clean ssf2t.zip."
    }
}
$Missing = @($Known.PSObject.Properties.Name | Where-Object { -not $M.ContainsKey($_) })
$Layout = 'full'
if ($Missing.Count -gt 0) {
    $A = (@($Missing | Sort-Object) -join ',')
    $B = (@($Spec.parentMembers | Sort-Object) -join ',')
    if ($A -eq $B) { $Layout = 'split' }
    else { Stop-Refused ("the ZIP is missing " + ($Missing -join ', ') + '. Use a complete ssf2t.zip.') }
}
$HasKey = $M.ContainsKey($KeyName)

# apply the patch runs, then prove each patched member is the tested build
$Out = New-Object 'System.Collections.Generic.Dictionary[string,byte[]]'
foreach ($N in $M.Keys) { $Out[$N] = $M[$N] }
foreach ($Prop in $Spec.patched.PSObject.Properties) { $Out[$Prop.Name] = [byte[]]$M[$Prop.Name].Clone() }
foreach ($P in $Spec.patches) {
    $Buf = $Out[$P.member]
    $Off = [Convert]::ToInt32($P.offset, 16)
    $After = ConvertFrom-HexString $P.after
    if ($Off + $After.Length -gt $Buf.Length) { Stop-Refused "internal error: a patch runs past $($P.member)." 8 }
    [Array]::Copy($After, 0, $Buf, $Off, $After.Length)
}
foreach ($Prop in $Spec.patched.PSObject.Properties) {
    if ((Get-Sha256Hex $Out[$Prop.Name]) -ne $Prop.Value.sha256) { Stop-Refused "internal error: patched $($Prop.Name) does not match the tested build." 8 }
}

$Folder = Split-Path -Parent $Src
if ($env:SSF2T_CROSSOVER_OUT) { $Folder = $env:SSF2T_CROSSOVER_OUT }
if (-not (Test-Path -LiteralPath $Folder -PathType Container)) { Stop-Refused "output folder not found: $Folder" }
$Dest = Join-Path $Folder $Spec.output
$Receipt = $Dest + '.receipt.json'
$Tmp = $Dest + '.part'
$RTmp = $Receipt + '.part'
if ([IO.Path]::GetFullPath($Dest) -eq [IO.Path]::GetFullPath($Src)) { Stop-Refused 'refusing to overwrite the input archive.' }
foreach ($P in @($Dest, $Receipt, $Tmp, $RTmp)) {
    if (Test-Path -LiteralPath $P) { Stop-Refused "$P already exists; move it away first." }
}

try {
    $Fs = New-Object IO.FileStream($Tmp, [IO.FileMode]::CreateNew, [IO.FileAccess]::ReadWrite)
    try {
        $Zip = New-Object IO.Compression.ZipArchive($Fs, [IO.Compression.ZipArchiveMode]::Create, $true)
        try {
            foreach ($O in $In.Order) {
                $E = $Zip.CreateEntry($O.Name, [IO.Compression.CompressionLevel]::Optimal)
                $E.LastWriteTime = $O.Time
                $W = $E.Open()
                try { $Bytes = $Out[$O.Name]; $W.Write($Bytes, 0, $Bytes.Length) } finally { $W.Dispose() }
            }
        } finally { $Zip.Dispose() }
    } finally { $Fs.Dispose() }
    $Back = Read-FlatZip $Tmp
    foreach ($O in $In.Order) {
        if ((Get-Sha256Hex $Back.Members[$O.Name]) -ne (Get-Sha256Hex $Out[$O.Name])) {
            throw "internal error: $($O.Name) did not read back from the new ZIP."
        }
    }
    $Patched = [ordered]@{}
    foreach ($Prop in @($Spec.patched.PSObject.Properties | Sort-Object Name)) { $Patched[$Prop.Name] = $Prop.Value.sha256 }
    $Rec = [ordered]@{
        format = 1; status = 'installed'; release = $Spec.release; version = $Spec.version; preview = $true
        set = $Spec.set; title = $Spec.title; layout = $Layout; keyFileCopiedThrough = $HasKey
        tool = [ordered]@{ name = [IO.Path]::GetFileName($env:SELFPATH); sha256 = (Get-FileSha256Hex $env:SELFPATH) }
        cleanBaseOnly = $true; downloadsRom = $false; networkAccess = $false; embedsStockBytes = $false
        inputArchive = [IO.Path]::GetFileName($Src); inputArchiveSha256 = (Get-FileSha256Hex $Src)
        outputArchive = [IO.Path]::GetFileName($Dest); outputArchiveSha256 = (Get-FileSha256Hex $Tmp)
        patchFingerprint = $Spec.fingerprint; patchedMembers = $Patched
    }
    $Json = ($Rec | ConvertTo-Json -Depth 5)
    $Rs = New-Object IO.FileStream($RTmp, [IO.FileMode]::CreateNew, [IO.FileAccess]::Write)
    try { $Enc = New-Object Text.UTF8Encoding($false); $Jb = $Enc.GetBytes($Json + "`n"); $Rs.Write($Jb, 0, $Jb.Length) } finally { $Rs.Dispose() }
    [IO.File]::Move($Tmp, $Dest)
    [IO.File]::Move($RTmp, $Receipt)
} catch {
    foreach ($P in @($Tmp, $RTmp)) { if (Test-Path -LiteralPath $P) { Remove-Item -LiteralPath $P -Force } }
    Stop-Refused ($_.Exception.Message) 7
}

Write-Host ''
$KeyNote = ''
if ($HasKey) { $KeyNote = ', key copied through' }
Write-Host "  $($Spec.title) ($($Spec.set), $Layout layout$KeyNote)"
Write-Host '  Wrote:'
Write-Host "    $Dest"
Write-Host "    $Receipt"
Write-Host ''
if (-not $HasKey) {
    Write-Host "  Note: your ZIP has no $KeyName. Emulators need it inside the patched ZIP;" -ForegroundColor Yellow
    Write-Host "  Fightcade's own ssf2t.zip has it. Patch that one to play." -ForegroundColor Yellow
    Write-Host ''
}
if ($Layout -eq 'split') {
    Write-Host '  Split set: the emulator still reads 8 graphics ROMs from the parent ssf2.zip.'
    Write-Host ''
}
Write-Host "  To play: keep the name $($Spec.output) and load it in RetroArch with the"
Write-Host '  SSF2T TAG core (ssf2t-tag-v2-retroarch.zip; its launcher does it for you).'
Write-Host ''
Wait-IfConsole
exit 0
