@echo off
rem ===========================================================================
rem  MVSC-DHC roster-wide v4
rem  Generated from a patch spec by gen_cmd.py -- do not hand-edit.
rem  Drag a clean encrypted Euro-parent mvsc.zip onto this file, or run:
rem      V4.cmd "C:\path\to\mvsc.zip"
rem  This installer contains patch deltas and integrity metadata, not a ROM.
rem  It makes no network requests, never overwrites the clean input, and
rem  refuses patched/noncanonical sets.
rem ===========================================================================
setlocal
set "ROMPATH=%~f1"
set "SELFPATH=%~f0"
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'+'BEGIN=#';$i=$t.IndexOf($m);if($i -lt 0){Write-Host 'ERROR: installer marker missing.' -ForegroundColor Red;exit 9};& ([ScriptBlock]::Create($t.Substring($i+$m.Length)))"
set "RC=%errorlevel%"
endlocal & exit /b %RC%

#=PSBEGIN=#
$ErrorActionPreference = 'Stop'

function Pause-IfConsole {
    if ($Host.Name -eq 'ConsoleHost' -and -not $env:MVSC_DHC_NOPAUSE) {
        try { Read-Host '  Press Enter to close' | Out-Null } catch {}
    }
}

function Fail([string]$Message, [int]$Code = 1) {
    Write-Host ''
    Write-Host "  ERROR: $Message" -ForegroundColor Red
    Write-Host ''
    Pause-IfConsole
    exit $Code
}

function ConvertFrom-Hex([string]$Hex) {
    if (($Hex.Length % 2) -ne 0) { Fail 'internal hex string has odd length.' 8 }
    $Bytes = New-Object byte[] ($Hex.Length / 2)
    for ($i = 0; $i -lt $Bytes.Length; $i++) {
        $Bytes[$i] = [Convert]::ToByte($Hex.Substring($i * 2, 2), 16)
    }
    return ,$Bytes
}

function Get-Sha256([byte[]]$Bytes) {
    $Hash = [System.Security.Cryptography.SHA256]::Create()
    try {
        return (([BitConverter]::ToString($Hash.ComputeHash($Bytes))).Replace('-', '').ToLowerInvariant())
    } finally {
        $Hash.Dispose()
    }
}

function Test-Bytes([byte[]]$Buffer, [int]$Offset, [byte[]]$Expected) {
    if ($Offset -lt 0 -or $Offset + $Expected.Length -gt $Buffer.Length) { return $false }
    for ($i = 0; $i -lt $Expected.Length; $i++) {
        if ($Buffer[$Offset + $i] -ne $Expected[$i]) { return $false }
    }
    return $true
}

function Read-ZipMembers([string]$Path) {
    $Entries = New-Object 'System.Collections.Generic.Dictionary[string,byte[]]'
    $Metadata = New-Object 'System.Collections.Generic.Dictionary[string,object]'
    $Order = New-Object 'System.Collections.Generic.List[string]'
    try { $Zip = [System.IO.Compression.ZipFile]::OpenRead($Path) }
    catch { throw "not a readable ZIP archive: $Path" }
    try {
        foreach ($Entry in $Zip.Entries) {
            if ($Entries.ContainsKey($Entry.FullName)) {
                throw "archive has a duplicate member named $($Entry.FullName)."
            }
            $Memory = New-Object System.IO.MemoryStream
            $Stream = $Entry.Open()
            try { $Stream.CopyTo($Memory) } finally { $Stream.Dispose() }
            $Entries.Add($Entry.FullName, $Memory.ToArray())
            $Metadata.Add($Entry.FullName, [pscustomobject]@{
                LastWriteTime = $Entry.LastWriteTime
                ExternalAttributes = $Entry.ExternalAttributes
            })
            [void]$Order.Add($Entry.FullName)
            $Memory.Dispose()
        }
    } finally {
        $Zip.Dispose()
    }
    return [pscustomobject]@{ Entries=$Entries; Metadata=$Metadata; Order=$Order }
}

Write-Host ''
Write-Host '  MVSC-DHC roster-wide v4'
Write-Host '  ================================================================'
Write-Host '  The clean input is only read. A new patched ZIP is written.'

$Source = $env:ROMPATH
if ([string]::IsNullOrWhiteSpace($Source)) {
    $Candidates = @(
        (Join-Path ([Environment]::CurrentDirectory) 'mvsc.zip'),
        (Join-Path (Split-Path -Parent $env:SELFPATH) 'mvsc.zip')
    ) | Select-Object -Unique
    $Source = $Candidates | Where-Object {
        Test-Path -LiteralPath $_ -PathType Leaf
    } | Select-Object -First 1
}
if ([string]::IsNullOrWhiteSpace($Source)) {
    Fail 'drag a clean mvsc.zip onto this CMD or put mvsc.zip beside it.'
}
try { $Source = (Resolve-Path -LiteralPath $Source -ErrorAction Stop).ProviderPath }
catch { Fail "file not found: $Source" }
if (-not (Test-Path -LiteralPath $Source -PathType Leaf)) {
    Fail "not a file: $Source"
}

Add-Type -AssemblyName System.IO.Compression -ErrorAction SilentlyContinue
Add-Type -AssemblyName System.IO.Compression.FileSystem -ErrorAction SilentlyContinue

$Vanilla = @(
    @{ Name='mvc.01'; Size=131072; Sha256='565f2c1befc6dbcd727b65c8954d3263b1e8105cd16be3ff7399c0ff513d144e' }
    @{ Name='mvc.02'; Size=131072; Sha256='b460ea0d95c967e5276d0f1f6e0a68d3bcc6008ce7952b970069a211e460ec63' }
    @{ Name='mvc.05a'; Size=524288; Sha256='1dfd50972c8796624051857e16ddc2296932c39fb05ecfcd1bae6180a369285d' }
    @{ Name='mvc.06a'; Size=524288; Sha256='132316e99d02d197cd8b4b9227dccd9215f5f741bcd21d5abf5c3f07fb64354b' }
    @{ Name='mvc.07'; Size=524288; Sha256='8b29a492800ec41c9818f1cf880697b298af69c75d0dd6864ed06e65223930eb' }
    @{ Name='mvc.08'; Size=524288; Sha256='402a848e3860f20cdcf3ec80c640f27eaef36f4e7cd78a330913baedcd5356d8' }
    @{ Name='mvc.09'; Size=524288; Sha256='fd0e680e0e1b14a5d1e913ddaef37076dd80203326e305b1fe1f8070be0cd6b2' }
    @{ Name='mvc.10'; Size=524288; Sha256='e24119140931bc861bf791758af8eb375892260d8ffb633369ebedcbe21f172a' }
    @{ Name='mvc.11m'; Size=4194304; Sha256='5587602fb97953d0cd951392b3bbaef2d317ae943ff2f6608c46cb627b7b16ca' }
    @{ Name='mvc.12m'; Size=4194304; Sha256='971b949ca3ad2471bf5ddc5c87c10286eacba51c30b4cc2261328ec46732b920' }
    @{ Name='mvc.13m'; Size=4194304; Sha256='689b9f2e2f9105f6b6a456e836a289c65caf642d9c7d246ea95c2db256f2ce0d' }
    @{ Name='mvc.14m'; Size=4194304; Sha256='1be6ba60b3cc0e6b647c2a54ca06b948dbc72eb32efdead84bcaa1d2efd69db5' }
    @{ Name='mvc.15m'; Size=4194304; Sha256='37365288e38a8c41fb5d2eb72808038478def8c8aa368d85816b70a89f6a6f55' }
    @{ Name='mvc.16m'; Size=4194304; Sha256='c94231770a7377bf6c7817427f28b87db79f3be03287279e8a19bea34cca85be' }
    @{ Name='mvc.17m'; Size=4194304; Sha256='dc29f2f0bf56d60408e9b9a2fcfae6c684f8be97712c94f146386c9bbb9ab46f' }
    @{ Name='mvc.18m'; Size=4194304; Sha256='4f3ceefa11958fd92f88047f876e37a5a9a226ca9c28e3b9915a03f39a268947' }
    @{ Name='mvc.19m'; Size=4194304; Sha256='d245405b8fa57b315300d915b9b5f96859bc31b9a97f653e370c7f0f28a1fc7f' }
    @{ Name='mvc.20m'; Size=4194304; Sha256='6cb08b23e33cc97bd14c6bf0ed179c99952146328f0dc0f01e8135c2783466bd' }
    @{ Name='mvce.03a'; Size=524288; Sha256='48128b6f98c5171a0e734e99f01a273f526f2da74f08635732068c60c891d757' }
    @{ Name='mvce.04a'; Size=524288; Sha256='71ded7040f279d0ddea1326fc062465159ccd832a327230098e5740d2a747d67' }
    @{ Name='mvsc.key'; Size=20; Sha256='9ba914d01fdb50c562fef4d4a5c7ff4779f92340322272696a46025d33f7155c' }
)
$VanillaLookup = New-Object 'System.Collections.Generic.Dictionary[string,object]'
foreach ($Record in $Vanilla) {
    $VanillaLookup.Add([string]$Record.Name, $Record)
}

try { $Read = Read-ZipMembers $Source }
catch { Fail $_.Exception.Message }
$Entries = $Read.Entries
$Metadata = $Read.Metadata
$Order = $Read.Order

if ($Entries.Count -ne $Vanilla.Count) {
    Fail "wrong archive member count: got $($Entries.Count), expected $($Vanilla.Count)."
}
for ($i = 0; $i -lt $Vanilla.Count; $i++) {
    $Name = [string]$Order[$i]
    if (-not $VanillaLookup.ContainsKey($Name)) {
        Fail "archive contains unexpected member '$Name'."
    }
}
foreach ($Record in $Vanilla) {
    $Name = [string]$Record.Name
    if (-not $Entries.ContainsKey($Name)) { Fail "required member '$Name' is missing." }
    $Bytes = [byte[]]$Entries[$Name]
    if ($Bytes.Length -ne [int]$Record.Size) { Fail "$Name size is $($Bytes.Length), expected $($Record.Size)." }
    $Got = Get-Sha256 $Bytes
    if ($Got -ne [string]$Record.Sha256) {
        Fail "$Name SHA-256 mismatch. Start from the clean encrypted Euro-parent mvsc.zip; patched and wrong-revision sets are rejected."
    }
}

Write-Host ''
Write-Host "  Input : $Source"
Write-Host '  Set   : mvsc Euro 980123 encrypted parent (21 exact members)'

$Patches = @(
    @{ File='mvc.10'; Offset=0x071000; After='970c000060d53666f9bd' }
    @{ File='mvc.10'; Offset=0x07100B; After='00c8400867f9bd' }
    @{ File='mvc.10'; Offset=0x071013; After='00d0402666e740e748c0e000610a0e004a0667df4c07031060df4c0703e748f8' }
    @{ File='mvc.10'; Offset=0x071034; After='00615600df4c' }
    @{ File='mvc.10'; Offset=0x07103B; After='1fdf442d100fc0000214000666f94e0100c08df94e0100ee8de740e74880e00061be0e004a0667df4c07011060df4c0701e748f8' }
    @{ File='mvc.10'; Offset=0x071070; After='00617402df4c' }
    @{ File='mvc.10'; Offset=0x071077; After='1fdf442e4a1d010667f94e000066d5f94e00006ad52d0c080000c0006550024e220061fc1c004a0067440200742e140200020c010000623602023249e7f941' }
    @{ File='mvc.10'; Offset=0x0710B7; After='00c84070280010ccbd00662202b90c48443443' }
    @{ File='mvc.10'; Offset=0x0710CB; After='0000fe04670061ee1c023249e5f941' }
    @{ File='mvc.10'; Offset=0x0710DB; After='00ecfd70260010ceb712670061e01d023249e5f941' }
    @{ File='mvc.10'; Offset=0x0710F1; After='00ecfd8e210010f941' }
    @{ File='mvc.10'; Offset=0x0710FB; After='000cfeb0420010f941' }
    @{ File='mvc.10'; Offset=0x071105; After='0022fe304200202e0c2a00b00000667a00f941' }
    @{ File='mvc.10'; Offset=0x071119; After='002cfe304a002020673910' }
    @{ File='mvc.10'; Offset=0x071125; After='00d9fe424a06670002f000046000020f00066700700061601d0060fa006e0c220052000067f00000762e16e6004e240061041c004a0067de00bc1101000020f941' }
    @{ File='mvc.10'; Offset=0x071167; After='00eafdbc11010000200061ba1c0061921c023249e5f941' }
    @{ File='mvc.10'; Offset=0x07117F; After='0004fe8e210010006196130060ae00f941' }
    @{ File='mvc.10'; Offset=0x071191; After='002cfe304a00200067a000023249e5f943' }
    @{ File='mvc.10'; Offset=0x0711A3; After='0004fef1bd00105a66f943' }
    @{ File='mvc.10'; Offset=0x0711AF; After='0014feb14a00104e67f943' }
    @{ File='mvc.10'; Offset=0x0711BB; After='002afe311600202eb6e6003e6600762e16e6004e240061881b004a2e672e0c3200b00000675a002e0c0a00b00008672e0c0200b00014660061961c000c08000a64005200619c1c0060360000700061921cf941' }
    @{ File='mvc.10'; Offset=0x07120F; After='002cfe304200200061141c0061461d0061ba19023249e5f941' }
    @{ File='mvc.10'; Offset=0x071229; After='0004feb0420010f941' }
    @{ File='mvc.10'; Offset=0x071233; After='0014feb0420010f947' }
    @{ File='mvc.10'; Offset=0x07123D; After='00e0fa024a0467fcd6800100702b106e012b80000104670061ae12023249e5f941' }
    @{ File='mvc.10'; Offset=0x07125F; After='000cfe8e210010f941' }
    @{ File='mvc.10'; Offset=0x071269; After='002afeae11e600002000702e10b000f941' }
    @{ File='mvc.10'; Offset=0x07127B; After='002cfe304a002002672a70f941' }
    @{ File='mvc.10'; Offset=0x071289; After='00dafe80110020f941' }
    @{ File='mvc.10'; Offset=0x071293; After='0028feae11e60000202e0c2a00b0004066f941' }
    @{ File='mvc.10'; Offset=0x0712A7; After='001efe304a0020046730530020f941' }
    @{ File='mvc.10'; Offset=0x0712B7; After='0030fe304a00202467f943' }
    @{ File='mvc.10'; Offset=0x0712C3; After='0036fe31520020310c3000002012633042002031420020f941' }
    @{ File='mvc.10'; Offset=0x0712DD; After='0032fe30420020754e0061061b004a0067920300742e140200020c010000628403023249e5f941' }
    @{ File='mvc.10'; Offset=0x071305; After='000cfe70280010b0420010ccbd00666c03f941' }
    @{ File='mvc.10'; Offset=0x071319; After='0022fe304a002000676a0130420020f941' }
    @{ File='mvc.10'; Offset=0x07132B; After='0024fe301600202eb6e60000674601f941' }
    @{ File='mvc.10'; Offset=0x07133D; After='0026fe301000202eb0e600006634012e0c2a00b0000a672e0c3200b0000066220100762e16e6004e240061f219004a006710010061961af941' }
    @{ File='mvc.10'; Offset=0x071377; After='001efe30420020f941' }
    @{ File='mvc.10'; Offset=0x071381; After='001cfebc11' }
    @{ File='mvc.10'; Offset=0x071387; After='000020f941' }
    @{ File='mvc.10'; Offset=0x07138D; After='00dcfe30420020f941' }
    @{ File='mvc.10'; Offset=0x071397; After='0020fe3052002000617e1130100020f941' }
    @{ File='mvc.10'; Offset=0x0713A9; After='0030fe80110020f941' }
    @{ File='mvc.10'; Offset=0x0713B3; After='0032feae11e6000020f941' }
    @{ File='mvc.10'; Offset=0x0713BF; After='0036fe30420020f941' }
    @{ File='mvc.10'; Offset=0x0713C9; After='003efe30520020f941' }
    @{ File='mvc.10'; Offset=0x0713D3; After='0042fe30420020f941' }
    @{ File='mvc.10'; Offset=0x0713DD; After='0024fef943' }
    @{ File='mvc.10'; Offset=0x0713E3; After='00d4feb01300200020f941' }
    @{ File='mvc.10'; Offset=0x0713EF; After='00d6feae11e6000020f941' }
    @{ File='mvc.10'; Offset=0x0713FB; After='0068fef943' }
    @{ File='mvc.10'; Offset=0x071401; After='006efeb01300200020f941' }
    @{ File='mvc.10'; Offset=0x07140D; After='006afef943' }
    @{ File='mvc.10'; Offset=0x071413; After='0070feb01300200020f941' }
    @{ File='mvc.10'; Offset=0x07141F; After='006cfef943' }
    @{ File='mvc.10'; Offset=0x071425; After='0072feb01300200020023249e5f941' }
    @{ File='mvc.10'; Offset=0x071435; After='0094fef943' }
    @{ File='mvc.10'; Offset=0x07143B; After='00b4feb02300100010f941' }
    @{ File='mvc.10'; Offset=0x071447; After='009cfef943' }
    @{ File='mvc.10'; Offset=0x07144D; After='00bcfeb02300100010f941' }
    @{ File='mvc.10'; Offset=0x071459; After='00a4fef943' }
    @{ File='mvc.10'; Offset=0x07145F; After='00c4feb02300100010f941' }
    @{ File='mvc.10'; Offset=0x07146B; After='00acfef943' }
    @{ File='mvc.10'; Offset=0x071471; After='00ccfeb0230010001000600402f941' }
    @{ File='mvc.10'; Offset=0x071481; After='005cfe305200200060f60100702e10e600f941' }
    @{ File='mvc.10'; Offset=0x071495; After='0028fe3012002001b0006782012e0c2a00b0000066780102364be5f941' }
    @{ File='mvc.10'; Offset=0x0714B3; After='0004fef0bd003000666601f941' }
    @{ File='mvc.10'; Offset=0x0714C1; After='001cfe3016002001b60066560100b600675001f941' }
    @{ File='mvc.10'; Offset=0x0714D7; After='001efe304a002000674201f941' }
    @{ File='mvc.10'; Offset=0x0714E5; After='00dcfe304a002000663401f941' }
    @{ File='mvc.10'; Offset=0x0714F3; After='0020fe300c0200002000642401007600164e2400615818004a0067140100782e18e600f941' }
    @{ File='mvc.10'; Offset=0x071519; After='001cfe301a00200061e618f941' }
    @{ File='mvc.10'; Offset=0x071527; After='001efe30420020f941' }
    @{ File='mvc.10'; Offset=0x071531; After='001cfebc11' }
    @{ File='mvc.10'; Offset=0x071537; After='000020f941' }
    @{ File='mvc.10'; Offset=0x07153D; After='00dcfe30420020f941' }
    @{ File='mvc.10'; Offset=0x071547; After='0020fe305200200061ce0f30100020f941' }
    @{ File='mvc.10'; Offset=0x071559; After='0030fe80110020f941' }
    @{ File='mvc.10'; Offset=0x071563; After='0032fe84110020f941' }
    @{ File='mvc.10'; Offset=0x07156D; After='0036fe30420020f941' }
    @{ File='mvc.10'; Offset=0x071577; After='003efe30520020f941' }
    @{ File='mvc.10'; Offset=0x071581; After='00d4fe85110020f941' }
    @{ File='mvc.10'; Offset=0x07158B; After='00d6fe84110020f941' }
    @{ File='mvc.10'; Offset=0x071595; After='0062fef943' }
    @{ File='mvc.10'; Offset=0x07159B; After='006efeb01300200020f941' }
    @{ File='mvc.10'; Offset=0x0715A7; After='0064fef943' }
    @{ File='mvc.10'; Offset=0x0715AD; After='0070feb01300200020f941' }
    @{ File='mvc.10'; Offset=0x0715B9; After='0066fef943' }
    @{ File='mvc.10'; Offset=0x0715BF; After='0072feb01300200020023249e5f941' }
    @{ File='mvc.10'; Offset=0x0715CF; After='0074fef943' }
    @{ File='mvc.10'; Offset=0x0715D5; After='00b4feb02300100010f941' }
    @{ File='mvc.10'; Offset=0x0715E1; After='007cfef943' }
    @{ File='mvc.10'; Offset=0x0715E7; After='00bcfeb02300100010f941' }
    @{ File='mvc.10'; Offset=0x0715F3; After='0084fef943' }
    @{ File='mvc.10'; Offset=0x0715F9; After='00c4feb02300100010f941' }
    @{ File='mvc.10'; Offset=0x071605; After='008cfef943' }
    @{ File='mvc.10'; Offset=0x07160B; After='00ccfeb02300100010f941' }
    @{ File='mvc.10'; Offset=0x071617; After='0042fe3042002000606000f941' }
    @{ File='mvc.10'; Offset=0x071625; After='00dafe300c2a000020006750002e0c2a00b0000066460000762e16e6004e2400611417004a00673400f941' }
    @{ File='mvc.10'; Offset=0x071651; After='002cfebc1101000020f941' }
    @{ File='mvc.10'; Offset=0x07165D; After='00eafdbc11010000200061c41700619c17023249e5f941' }
    @{ File='mvc.10'; Offset=0x071675; After='0004fe8e2100100061a00e754ee740af0c0100ce99020000662200e748f8' }
    @{ File='mvc.10'; Offset=0x071694; After='00615817004a106700613c00004a0867df4c' }
    @{ File='mvc.10'; Offset=0x0716A7; After='1fdf441460df4c' }
    @{ File='mvc.10'; Offset=0x0716AF; After='1fdf442e4abf0000661c00f94e01007e74e740e748f8' }
    @{ File='mvc.10'; Offset=0x0716C6; After='0061a001df4c' }
    @{ File='mvc.10'; Offset=0x0716CD; After='1fdf440070754ef94e0100f874007049284e220061b416004a00677c0100742e140200020c010000626e016e0c2200520000674c012e0c2a00b0000a672e0c3200b00000663a01023249e7f941' }
    @{ File='mvc.10'; Offset=0x07171B; After='00c840f0bd001000662801023249e5f941' }
    @{ File='mvc.10'; Offset=0x07172D; After='0004fef0bd001000661601f941' }
    @{ File='mvc.10'; Offset=0x07173B; After='000cfef0bd001000661401f941' }
    @{ File='mvc.10'; Offset=0x071749; After='002afe301000202eb0e60000660201f941' }
    @{ File='mvc.10'; Offset=0x07175B; After='00dafe300c2a0000200066f200f941' }
    @{ File='mvc.10'; Offset=0x07176B; After='00e8fd304a00200066d8004c224e2400614815004a0067be00f941' }
    @{ File='mvc.10'; Offset=0x071787; After='005afe30520020f941' }
    @{ File='mvc.10'; Offset=0x071791; After='0038fe841100202eb8e60000679600050800000e6700702e1002002d0138c000669e00050801000a672e0c0300740200658e0000762e16e6004e2400618c15004a00677000f941' }
    @{ File='mvc.10'; Offset=0x0717D9; After='00dcfe304a002000667200f941' }
    @{ File='mvc.10'; Offset=0x0717E7; After='001efe304a002000674800f941' }
    @{ File='mvc.10'; Offset=0x0717F5; After='001cfe301000202eb0e60000663a00023249e5f941' }
    @{ File='mvc.10'; Offset=0x07180B; After='0084fe30200010f941' }
    @{ File='mvc.10'; Offset=0x071815; After='0014feb0b0001000663600f941' }
    @{ File='mvc.10'; Offset=0x071823; After='0020fe300c0200002000641a000170754e0172226002721e6003721a60047216600572126006720e6007720a6008720660097202600a72f941' }
    @{ File='mvc.10'; Offset=0x07185D; After='0042fe811100200070754e00742e140200f941' }
    @{ File='mvc.10'; Offset=0x071871; After='0022febc1101000020f941' }
    @{ File='mvc.10'; Offset=0x07187D; After='0024feae11e6000020f941' }
    @{ File='mvc.10'; Offset=0x071889; After='0038fe30100020f941' }
    @{ File='mvc.10'; Offset=0x071893; After='0026fe80110020f941' }
    @{ File='mvc.10'; Offset=0x07189D; After='0062fef943' }
    @{ File='mvc.10'; Offset=0x0718A3; After='0068feb01300200020f941' }
    @{ File='mvc.10'; Offset=0x0718AF; After='0064fef943' }
    @{ File='mvc.10'; Offset=0x0718B5; After='006afeb01300200020f941' }
    @{ File='mvc.10'; Offset=0x0718C1; After='0066fef943' }
    @{ File='mvc.10'; Offset=0x0718C7; After='006cfeb01300200020023249e5f941' }
    @{ File='mvc.10'; Offset=0x0718D7; After='0074fef943' }
    @{ File='mvc.10'; Offset=0x0718DD; After='0094feb02300100010f941' }
    @{ File='mvc.10'; Offset=0x0718E9; After='007cfef943' }
    @{ File='mvc.10'; Offset=0x0718EF; After='009cfeb02300100010f941' }
    @{ File='mvc.10'; Offset=0x0718FB; After='0084fef943' }
    @{ File='mvc.10'; Offset=0x071901; After='00a4feb02300100010f941' }
    @{ File='mvc.10'; Offset=0x07190D; After='008cfef943' }
    @{ File='mvc.10'; Offset=0x071913; After='00acfeb02300100010f941' }
    @{ File='mvc.10'; Offset=0x07191F; After='003cfe30520020f941' }
    @{ File='mvc.10'; Offset=0x071929; After='0042fe30420020754ee740af0c01002acc020000661600e748f8' }
    @{ File='mvc.10'; Offset=0x071944; After='0061a814004a046700611a00df4c' }
    @{ File='mvc.10'; Offset=0x071953; After='1fdf442e4ae8000667f94e010026cdf94e010030cd4c264c2200612814004a006646004c2200619612004a0067f0016c22540000610e14004a22666c2654004b2200617a12004a0067d4016b2254000061f213004a0067c601037210604c266c225400027206604c22cb970172007429140200020c01000062a401023048e7f941' }
    @{ File='mvc.10'; Offset=0x0719D5; After='00c840f0b3000000665001023048e5f941' }
    @{ File='mvc.10'; Offset=0x0719E7; After='0004fef0b3000000663e01690c2200520000673401290c2a00b0000a67290c3200b00000662201f941' }
    @{ File='mvc.10'; Offset=0x071A11; After='00e8fd304a0020006614010076007c3c1c' }
    @{ File='mvc.10'; Offset=0x071A23; After='00007e010c010014662916e600023048e5f941' }
    @{ File='mvc.10'; Offset=0x071A37; After='0014fe302a00001860012f0061ee0f1f22000c020000672601004a0067da00017e00782918e6004924032f04260061f4121f26004a0067c000023048e5f941' }
    @{ File='mvc.10'; Offset=0x071A77; After='0014fe30280000f941' }
    @{ File='mvc.10'; Offset=0x071A81; After='0062fe81110020f941' }
    @{ File='mvc.10'; Offset=0x071A8B; After='0064fe87110020f941' }
    @{ File='mvc.10'; Offset=0x071A95; After='0066fe86110020f941' }
    @{ File='mvc.10'; Offset=0x071A9F; After='0044fe83110020023048e5f941' }
    @{ File='mvc.10'; Offset=0x071AAD; After='0074fe8c210000f941' }
    @{ File='mvc.10'; Offset=0x071AB7; After='007cfe8b210000f941' }
    @{ File='mvc.10'; Offset=0x071AC1; After='0084fe85210000f941' }
    @{ File='mvc.10'; Offset=0x071ACB; After='008cfe84210000f941' }
    @{ File='mvc.10'; Offset=0x071AD5; After='003afe3052002029b6e600266684ba2c66f941' }
    @{ File='mvc.10'; Offset=0x071AE9; After='001cfe83110020f941' }
    @{ File='mvc.10'; Offset=0x071AF3; After='001efebc110a000020f941' }
    @{ File='mvc.10'; Offset=0x071AFF; After='00dcfe304200206c60f941' }
    @{ File='mvc.10'; Offset=0x071B0B; After='0040fe3052002084ba4267f941' }
    @{ File='mvc.10'; Offset=0x071B19; After='0058fe30520020f941' }
    @{ File='mvc.10'; Offset=0x071B23; After='00dcfebc11010000202a60f941' }
    @{ File='mvc.10'; Offset=0x071B31; After='004cfe30520020f941' }
    @{ File='mvc.10'; Offset=0x071B3B; After='0064fe30420020f941' }
    @{ File='mvc.10'; Offset=0x071B45; After='0066febc11' }
    @{ File='mvc.10'; Offset=0x071B4B; After='000020f941' }
    @{ File='mvc.10'; Offset=0x071B51; After='00dcfe30420020f941' }
    @{ File='mvc.10'; Offset=0x071B5B; After='001cfebc11' }
    @{ File='mvc.10'; Offset=0x071B61; After='000020f941' }
    @{ File='mvc.10'; Offset=0x071B67; After='001efe30420020046000610400754e4e2200611c12004a426700742e140200020c01003662023048e7f941' }
    @{ File='mvc.10'; Offset=0x071B93; After='00c840f0bd00002666420a0100f941' }
    @{ File='mvc.10'; Offset=0x071BA3; After='001cfebc11' }
    @{ File='mvc.10'; Offset=0x071BA9; After='000020f941' }
    @{ File='mvc.10'; Offset=0x071BAF; After='001efe30420020f941' }
    @{ File='mvc.10'; Offset=0x071BB9; After='00dcfe30420020754efc33' }
    @{ File='mvc.10'; Offset=0x071BC7; After='001cfe7942' }
    @{ File='mvc.10'; Offset=0x071BCD; After='001efe7942' }
    @{ File='mvc.10'; Offset=0x071BD3; After='00dcfe754ee740e748f8' }
    @{ File='mvc.10'; Offset=0x071BDE; After='00611a00df4c' }
    @{ File='mvc.10'; Offset=0x071BE5; After='1fdf446e9b7002066ef94e010054b7f94e01009eb70061f211004a00672e01454a006728014e266b28c0000c2000671c014c2200617c11004a006710014b2200617011004a00670401ecb7c0000066fc0000742c140200020c01000062ee00023048e7f941' }
    @{ File='mvc.10'; Offset=0x071C4B; After='00c840f0b900000066dc00023048e5f941' }
    @{ File='mvc.10'; Offset=0x071C5D; After='0004fef0b900000066ca006c0c220052000067c0002c0c3200b0000066b600f941' }
    @{ File='mvc.10'; Offset=0x071C7F; After='00e8fd304a00200066a80000762c16e6004c240061c610004a00679600023048e5f941' }
    @{ File='mvc.10'; Offset=0x071CA3; After='0014fe3028000000678400f941' }
    @{ File='mvc.10'; Offset=0x071CB1; After='0062febc1101000020f941' }
    @{ File='mvc.10'; Offset=0x071CBD; After='0064fe30420020f941' }
    @{ File='mvc.10'; Offset=0x071CC7; After='0066febc11' }
    @{ File='mvc.10'; Offset=0x071CCD; After='000020f941' }
    @{ File='mvc.10'; Offset=0x071CD3; After='0044fe83110020023048e5f941' }
    @{ File='mvc.10'; Offset=0x071CE1; After='0074fe8c210000f941' }
    @{ File='mvc.10'; Offset=0x071CEB; After='007cfeb0420000f941' }
    @{ File='mvc.10'; Offset=0x071CF5; After='0084fe84210000f941' }
    @{ File='mvc.10'; Offset=0x071CFF; After='008cfe84210000f941' }
    @{ File='mvc.10'; Offset=0x071D09; After='003afe30520020f941' }
    @{ File='mvc.10'; Offset=0x071D13; After='001cfe83110020f941' }
    @{ File='mvc.10'; Offset=0x071D1D; After='001efebc110a000020f941' }
    @{ File='mvc.10'; Offset=0x071D29; After='00dcfe30420020754ee740e74880e02f201600800c0100ca4d0a67800c0100224e0066bc0000619e10004a0067b20000703910' }
    @{ File='mvc.10'; Offset=0x071D5D; After='00d8fe1867000c02000c620053f941' }
    @{ File='mvc.10'; Offset=0x071D6D; After='0034fe304200003942' }
    @{ File='mvc.10'; Offset=0x071D77; After='00d8fe00742e140200020c010000628200023249e5f941' }
    @{ File='mvc.10'; Offset=0x071D8F; After='0004fef0bd001000667000f941' }
    @{ File='mvc.10'; Offset=0x071D9D; After='0030fe00723012002000676000f941' }
    @{ File='mvc.10'; Offset=0x071DAD; After='0032fe301000202eb0e600366630420020f941' }
    @{ File='mvc.10'; Offset=0x071DC1; After='0030fe30420020f941' }
    @{ File='mvc.10'; Offset=0x071DCB; After='0036fe30420020f941' }
    @{ File='mvc.10'; Offset=0x071DD5; After='0034fe81110020017002d0c013' }
    @{ File='mvc.10'; Offset=0x071DE3; After='00d8fe010c010002662860306030420020f941' }
    @{ File='mvc.10'; Offset=0x071DF7; After='0030fe30420020f941' }
    @{ File='mvc.10'; Offset=0x071E01; After='0036fe30420020df4c0701df4400702d1044c4754edf4c0701df440270754edf4c0701df440470754e00702d0c080000c00065e200b90c48443443' }
    @{ File='mvc.10'; Offset=0x071E3D; After='0000fe0066d40000742e140200020c01000062c600023249e7f941' }
    @{ File='mvc.10'; Offset=0x071E59; After='00c840f0bd00100066b400023249e5f941' }
    @{ File='mvc.10'; Offset=0x071E6B; After='00ecfdf0bd00100066a20000702e10b000f941' }
    @{ File='mvc.10'; Offset=0x071E7F; After='002cfe000c2a000a67304a0020006688000860304a002000677e003910' }
    @{ File='mvc.10'; Offset=0x071E9D; After='00d9fe424a06670002f000046000020f0000666600f943' }
    @{ File='mvc.10'; Offset=0x071EB5; After='00e0fa424a0467fcd28001294a6e015066294a00014a66f941' }
    @{ File='mvc.10'; Offset=0x071ECF; After='0030fe304a00203e66f941' }
    @{ File='mvc.10'; Offset=0x071EDB; After='000cfe8e210010304216202e10b000f943' }
    @{ File='mvc.10'; Offset=0x071EED; After='00dafe801300202e10e60080111e2080111c202e0c2a00b0000a66304a12200467305312200170754e0070754e00702d0c080000c05e65b90c48443443' }
    @{ File='mvc.10'; Offset=0x071F2B; After='0000fe526600742e140200020c01004662023249e5f941' }
    @{ File='mvc.10'; Offset=0x071F43; After='000cfef0bd00102e66304a1620306630101c202eb0e6002666f941' }
    @{ File='mvc.10'; Offset=0x071F5F; After='00dafe301000202eb0b0001666f941' }
    @{ File='mvc.10'; Offset=0x071F6F; After='000cfeb04200100170754eb04200100170754e0070754edf4c0310794800000640e7403c3f000000601a01df4c0310794800004c40e7403c3f000000600601df4c031079480000b240e7403c3f00000060f200df4c0310794800001441e7403c3f00000060de00df4c0310794800007a41e7403c3f00000060ca00df4c031079480000de41e7403c3f01000060b600df4c0310794800002442e7403c3f01000060a200df4c0310794800008242e7403c3f010000608e00df4c031079480000dc42e7403c3f010000607a00df4c0310794800003843e7403c3f010000606600df4c0310794800009043e7403c3f020000605200df4c031079480000d643e7403c3f020000603e00df4c0310794800003244e7403c3f020000602a00df4c0310794800008a44e7403c3f020000601600df4c031079480000e444e7403c3f020000600200794a' }
    @{ File='mvc.10'; Offset=0x0720B5; After='002cfe1266794a' }
    @{ File='mvc.10'; Offset=0x0720BD; After='0030fe0a662e0c2a00b00000668600f9bd' }
    @{ File='mvc.10'; Offset=0x0720CF; After='00c8402067f9bd' }
    @{ File='mvc.10'; Offset=0x0720D7; After='00d0403267e748c0e000617600004a0667df4c07035060df4c07035c60394a' }
    @{ File='mvc.10'; Offset=0x0720F7; After='002cfe4266394a' }
    @{ File='mvc.10'; Offset=0x0720FF; After='0030fe3a662e0c2a00b00032671860394a' }
    @{ File='mvc.10'; Offset=0x072111; After='002dfe2866394a' }
    @{ File='mvc.10'; Offset=0x072119; After='0031fe20662e0c2a00b0001867e748c0c00061ec00004a0667df4c03030660df4c03031260e748f8' }
    @{ File='mvc.10'; Offset=0x072142; After='007a2f3a340000613a01df4c' }
    @{ File='mvc.10'; Offset=0x07214F; After='1f8f54df440080754e00702d0c080000c00065ae00b90c48443443' }
    @{ File='mvc.10'; Offset=0x07216B; After='0000fe0066a0000824f9bd' }
    @{ File='mvc.10'; Offset=0x072177; After='00c8405467f9bd' }
    @{ File='mvc.10'; Offset=0x07217F; After='00d0406c674e2200617a09004a1a67f941' }
    @{ File='mvc.10'; Offset=0x072191; After='00e0fa304a001000667a00fcd08001304a001000666e006e22540000615409004a5467f941' }
    @{ File='mvc.10'; Offset=0x0721B7; After='00e0fa304a001000665400fcd08001304a0010006648003860394a' }
    @{ File='mvc.10'; Offset=0x0721D3; After='002cfe00663c00394a' }
    @{ File='mvc.10'; Offset=0x0721DD; After='0030fe006632002e0c2a00b000006728001860394a' }
    @{ File='mvc.10'; Offset=0x0721F3; After='002dfe1c66394a' }
    @{ File='mvc.10'; Offset=0x0721FB; After='0031fe14662e0c2a00b0000c67422000610c00754e0070754e0170754e482200612409004a5e674152f941' }
    @{ File='mvc.10'; Offset=0x072227; After='00e0fa01304053304a00004c66f941' }
    @{ File='mvc.10'; Offset=0x072237; After='0060fc304a00004066f941' }
    @{ File='mvc.10'; Offset=0x072243; After='00e0fa284a6e011267e8430e011f7011b22a67fcd20300c851f6' }
    @{ File='mvc.10'; Offset=0x07225E; After='f941' }
    @{ File='mvc.10'; Offset=0x072261; After='0060fc284a6e011267e8430e011f7011b20c67fcd20300c851f6' }
    @{ File='mvc.10'; Offset=0x07227C; After='0070754e0170754e4828051e0061640b004a00670a014c220061cc08004a0067fe0007b80066f800006156064e220061ea0a004a0067dc0000742e140200020c01000062da00023249e7f941' }
    @{ File='mvc.10'; Offset=0x0722C9; After='00c840f0bd00100066c800023249e5f941' }
    @{ File='mvc.10'; Offset=0x0722DB; After='00ecfdf0bd00100066b600f941' }
    @{ File='mvc.10'; Offset=0x0722E9; After='00e8fd304a00200066a8006e0c2200520000679e000076f941' }
    @{ File='mvc.10'; Offset=0x072303; After='002efe3016002000702e10e6000008000000668400400c3e0000627c0048e20072f941' }
    @{ File='mvc.10'; Offset=0x072327; After='0020fe30120020410c020000626600415249eb4180023249e5f941' }
    @{ File='mvc.10'; Offset=0x072343; After='0004fef0bd00101866f941' }
    @{ File='mvc.10'; Offset=0x07234F; After='002cfe304a00200c6703b0086600611004006038002e0c2a00b00000662e0000762e16e6000308000000662000430c3e00006218004be20061b20300600e000061ac04004a04670061a203754ee740794a' }
    @{ File='mvc.10'; Offset=0x0723A1; After='002cfe1a66794a' }
    @{ File='mvc.10'; Offset=0x0723A9; After='0030fe1266394a' }
    @{ File='mvc.10'; Offset=0x0723B1; After='00e0fb0a66394a' }
    @{ File='mvc.10'; Offset=0x0723B9; After='0060fd00674800002f0e208004' }
    @{ File='mvc.10'; Offset=0x0723C7; After='00ba4688e8f9493f00ca2f3410000020674002' }
    @{ File='mvc.10'; Offset=0x0723DB; After='004053f949' }
    @{ File='mvc.10'; Offset=0x0723E1; After='00e0fa344a00000e66fcd88001344a000004661f200e601f20e748f0' }
    @{ File='mvc.10'; Offset=0x0723FE; After='00615e05df4c' }
    @{ File='mvc.10'; Offset=0x072405; After='0fdf446d28625a0e29f94e0000ec44e740794a' }
    @{ File='mvc.10'; Offset=0x072419; After='002cfe1a66794a' }
    @{ File='mvc.10'; Offset=0x072421; After='0030fe1266394a' }
    @{ File='mvc.10'; Offset=0x072429; After='00e0fb0a66394a' }
    @{ File='mvc.10'; Offset=0x072431; After='0060fd00674800002f0e208004' }
    @{ File='mvc.10'; Offset=0x07243F; After='00ba4688e8f9493f00ca2f3410000020674002' }
    @{ File='mvc.10'; Offset=0x072453; After='004053f949' }
    @{ File='mvc.10'; Offset=0x072459; After='00e0fa344a00000e66fcd88001344a000004661f200e601f20e748f0' }
    @{ File='mvc.10'; Offset=0x072476; After='0061e604df4c' }
    @{ File='mvc.10'; Offset=0x07247D; After='0fdf446d285e5a0e29f94e00004845e740794a' }
    @{ File='mvc.10'; Offset=0x072491; After='002cfe1a66794a' }
    @{ File='mvc.10'; Offset=0x072499; After='0030fe1266394a' }
    @{ File='mvc.10'; Offset=0x0724A1; After='00e0fb0a66394a' }
    @{ File='mvc.10'; Offset=0x0724A9; After='0060fd00674800002f0e208004' }
    @{ File='mvc.10'; Offset=0x0724B7; After='00ba4688e8f9493f00ca2f3410000020674002' }
    @{ File='mvc.10'; Offset=0x0724CB; After='004053f949' }
    @{ File='mvc.10'; Offset=0x0724D1; After='00e0fa344a00000e66fcd88001344a000004661f200e601f20e748f0' }
    @{ File='mvc.10'; Offset=0x0724EE; After='00616e04df4c' }
    @{ File='mvc.10'; Offset=0x0724F5; After='0fdf446d28665a0e29f94e0000a4452b4a6e0108672b5201010061dc042b4a0001046700614800754ee74898fcf941' }
    @{ File='mvc.10'; Offset=0x072525; After='002efe30420020f941' }
    @{ File='mvc.10'; Offset=0x07252F; After='002cfe304a00202467f941' }
    @{ File='mvc.10'; Offset=0x07253B; After='00e8fd304a0020186600762e16e60000619c02004a0a67f941' }
    @{ File='mvc.10'; Offset=0x072555; After='002efe83110020df4c3f19754ee748f8' }
    @{ File='mvc.10'; Offset=0x072566; After='00616206007e2b1e00010067c201470c30000062b2012b420001eb41d0004753007c101c1842064a00679400465300763316006003080700006784000061e20569245400007003100002600000677800023249e5f949' }
    @{ File='mvc.10'; Offset=0x0725BD; After='00ecfdf4b5001000662c0003027f0083170060f949' }
    @{ File='mvc.10'; Offset=0x0725D3; After='005efe34520020f949' }
    @{ File='mvc.10'; Offset=0x0725DD; After='0050fe34520020f949' }
    @{ File='mvc.10'; Offset=0x0725E7; After='0056fe3452002000603400063a4a22082f006168055f20004a1c670061c6050070331000601067000807000a6600027f0003027f0003b0053c33420060cf5160' }
    @{ File='mvc.10'; Offset=0x072628; After='00600a01023249e5f949' }
    @{ File='mvc.10'; Offset=0x072633; After='00ecfd7422001009200067e2' }
    @{ File='mvc.10'; Offset=0x072640; After='f949' }
    @{ File='mvc.10'; Offset=0x072643; After='000cfef4b300100067be00c9b50066ce' }
    @{ File='mvc.10'; Offset=0x072654; After='f949' }
    @{ File='mvc.10'; Offset=0x072657; After='002cfe344a00200067c0' }
    @{ File='mvc.10'; Offset=0x072662; After='f949' }
    @{ File='mvc.10'; Offset=0x072665; After='00e8fd344a00200066b2' }
    @{ File='mvc.10'; Offset=0x072670; After='f949' }
    @{ File='mvc.10'; Offset=0x072673; After='0004fef4b500100066a4' }
    @{ File='mvc.10'; Offset=0x07267E; After='023048e7f949' }
    @{ File='mvc.10'; Offset=0x072685; After='00c840f4b50000006692' }
    @{ File='mvc.10'; Offset=0x072690; After='0070f949' }
    @{ File='mvc.10'; Offset=0x072695; After='002efe34100020006782' }
    @{ File='mvc.10'; Offset=0x0726A0; After='0072001201026000006776' }
    @{ File='mvc.10'; Offset=0x0726AC; After='03021f0000021f0003b0006668' }
    @{ File='mvc.10'; Offset=0x0726BA; After='00722a12e6000108000000665a' }
    @{ File='mvc.10'; Offset=0x0726C8; After='410c3e00006252' }
    @{ File='mvc.10'; Offset=0x0726D0; After='49e201b000664a' }
    @{ File='mvc.10'; Offset=0x0726D8; After='0076f949' }
    @{ File='mvc.10'; Offset=0x0726DD; After='002efe3416002083170060f949' }
    @{ File='mvc.10'; Offset=0x0726EB; After='005efe34520020f949' }
    @{ File='mvc.10'; Offset=0x0726F5; After='0050fe34520020f949' }
    @{ File='mvc.10'; Offset=0x0726FF; After='0056fe3452002000601c' }
    @{ File='mvc.10'; Offset=0x07270A; After='00702b100001400c300000641600eb49d00006324152811900002b5200010060fafe2b42000100615405df4c' }
    @{ File='mvc.10'; Offset=0x072737; After='1f754e00618e0400702b100001400c30001a640300800083170060eb41d00006324152811100002b520001754e3342006000611c05754e00615a0483170060f941' }
    @{ File='mvc.10'; Offset=0x072779; After='005efe30520020f941' }
    @{ File='mvc.10'; Offset=0x072783; After='0050fe30520020754ee7486848007003100002600046670061ea0369245400023249e5f949' }
    @{ File='mvc.10'; Offset=0x0727A9; After='00ecfdf4b500102e660061160403027f0083170060f949' }
    @{ File='mvc.10'; Offset=0x0727C1; After='005efe34520020f949' }
    @{ File='mvc.10'; Offset=0x0727CB; After='0050fe34520020f949' }
    @{ File='mvc.10'; Offset=0x0727D5; After='0056fe34520020017002600070df4c1216754e0070030800004a66430c3e0044620072f941' }
    @{ File='mvc.10'; Offset=0x0727FB; After='0020fe30120020410c02003262033048e2013844524ceb448000160061b20349e502384ce5f941' }
    @{ File='mvc.10'; Offset=0x072823; After='0014fe302a00400c67eb49020185290010017002600070754e063e4e2200612003004a086700612600004a14666e22540000610c03004a0e6700611200004a0667073c0170754e073c0070754e0074006156030076331600602067030807001267007003100002600010670061fcfe004a086700611600004a0c664252420c0200cc650070754e0170754ef941' }
    @{ File='mvc.10'; Offset=0x0728B1; After='002cfe304a00203e67f941' }
    @{ File='mvc.10'; Offset=0x0728BD; After='00e8fd304a00203266023249e5f941' }
    @{ File='mvc.10'; Offset=0x0728CD; After='00ecfd702400100a202067f941' }
    @{ File='mvc.10'; Offset=0x0728DB; After='0004fef0b500101466023249e7f941' }
    @{ File='mvc.10'; Offset=0x0728EB; After='00c840f0b5001004660170754e0070754ee748f8fd00740061c6020070331000601a6733420060000807001066f941' }
    @{ File='mvc.10'; Offset=0x07291B; After='005efe304a00200467305300202b4a6e012267063a4552eb410e011f7e10ba0c6610422b4a6e0104672b536e01fcd00300cf51ea' }
    @{ File='mvc.10'; Offset=0x072950; After='4252420c0200aa65df4cbf1f754e00618e04004a00674c004e220061f601004a00674000007400615202007633160060286733420060030807001466f941' }
    @{ File='mvc.10'; Offset=0x07298F; After='005efe304a002004673053002000611600f941' }
    @{ File='mvc.10'; Offset=0x0729A3; After='0054fe305200204252420c0200c465754e00611402eb410e011f7e104a0e67fcd00300cf51f6' }
    @{ File='mvc.10'; Offset=0x0729CA; After='0061ba02754e06304052801003027f00431101002b100101401102002b526e01754e0061dc012b4a6e013a67007a2b1a0101eb410e011f7e104a2267051028900200000c0200166310422b4a6e0104672b536e01f943' }
    @{ File='mvc.10'; Offset=0x072A21; After='0052fe31520020fcd00300cf51d4' }
    @{ File='mvc.10'; Offset=0x072A30; After='754ee74848004b244b2200612601004a0067b600006184010076331600604a67030807000266706000700310000260000c67006128fd004a00678e005a60023048e5f943' }
    @{ File='mvc.10'; Offset=0x072A75; After='00ecfd71220000092200677800f949' }
    @{ File='mvc.10'; Offset=0x072A85; After='000cfef4b3000000666a004a26df4c00120270754e06384452eb430e011f7e11b80a67fcd20300cf51f6' }
    @{ File='mvc.10'; Offset=0x072AB0; After='466000702b10010129900200000c02003662007629160100033040027f00003241021f0049e3013648ea400203001867405348e5eb490201342a00000a674a26df4c00120170754e4a26df4c00120070754e0920800c' }
    @{ File='mvc.10'; Offset=0x072B07; After='00ba463065800c' }
    @{ File='mvc.10'; Offset=0x072B0F; After='00bad72864003241020f00410c0a001c668004' }
    @{ File='mvc.10'; Offset=0x072B23; After='00ba4688e8f9413f00ca2f007230120000066741530170754e0070754e09208004' }
    @{ File='mvc.10'; Offset=0x072B45; After='00ba4688e8f9413f00ca2f007230120000066741530170754e0070754e00619e' }
    @{ File='mvc.10'; Offset=0x072B66; After='004a1867013c0078460c40000a650178460c8000026502780170754e0070754e00700630400c40002a65400c8000126540048000fcc0d0008006' }
    @{ File='mvc.10'; Offset=0x072BA1; After='00ba9602781e6040044000fcc0d0008006' }
    @{ File='mvc.10'; Offset=0x072BB3; After='00ba6201780c60fcc070008006' }
    @{ File='mvc.10'; Offset=0x072BC1; After='00ba4600784022754ef947' }
    @{ File='mvc.10'; Offset=0x072BCD; After='00e0fa024a0467fcd68001754ee74890810061ea' }
    @{ File='mvc.10'; Offset=0x072BE2; After='00705f7ec026cf51fc' }
    @{ File='mvc.10'; Offset=0x072BEC; After='f941' }
    @{ File='mvc.10'; Offset=0x072BEF; After='005efe30420020f941' }
    @{ File='mvc.10'; Offset=0x072BF9; After='00e8fd30420020f941' }
    @{ File='mvc.10'; Offset=0x072C03; After='002efe30420020df4c8109754e0920000800005a66800c' }
    @{ File='mvc.10'; Offset=0x072C1B; After='00ba465265800c' }
    @{ File='mvc.10'; Offset=0x072C23; After='00ba623265800c' }
    @{ File='mvc.10'; Offset=0x072C2B; After='00ba961265800c' }
    @{ File='mvc.10'; Offset=0x072C33; After='00bad73a648004' }
    @{ File='mvc.10'; Offset=0x072C3B; After='00ba96027808608004' }
    @{ File='mvc.10'; Offset=0x072C45; After='00ba6201783c32d000c1804048404a1c660170754e8004' }
    @{ File='mvc.10'; Offset=0x072C5D; After='00ba4600783c327000c1804048404a04660170754e0070754ef947' }
    @{ File='mvc.10'; Offset=0x072C79; After='00e0fa024a0467fcd68001754ef941' }
    @{ File='mvc.10'; Offset=0x072C89; After='00e8fd304a00203066bc1101000020f941' }
    @{ File='mvc.10'; Offset=0x072C9B; After='004efe30520020f941' }
    @{ File='mvc.10'; Offset=0x072CA5; After='001cfebc11' }
    @{ File='mvc.10'; Offset=0x072CAB; After='000020f941' }
    @{ File='mvc.10'; Offset=0x072CB1; After='001efe30420020f941' }
    @{ File='mvc.10'; Offset=0x072CBB; After='00dcfe30420020754ee748800300700078007a393e3f00de3828674753f9413f00e238d0b31666283c04006abc52000c6628180600281a0700017006608850cf51e2' }
    @{ File='mvc.10'; Offset=0x072CFE; After='df4cc001754ee7488060f9413f00862f1174007210126ab252002a662812010003b222662812020028b2030026622a0c2a00b00010662a10800001b0086528b0030002620e6088584253c666df4c06010070754edf4c06010170754e00610400754ee74880030070393e3f00de3822674753f9413f00e238283c04006abc5200066628b6060008678850cf51ec' }
    @{ File='mvc.10'; Offset=0x072D8C; After='02600170df4cc001754e0920800c' }
    @{ File='mvc.10'; Offset=0x072D9B; After='0000301c67800c' }
    @{ File='mvc.10'; Offset=0x072DA3; After='0000341467800c' }
    @{ File='mvc.10'; Offset=0x072DAB; After='0000380c67800c' }
    @{ File='mvc.10'; Offset=0x072DB3; After='00003c04670070754e0170754ef941' }
    @{ File='mvc.10'; Offset=0x072DC3; After='00e0fa00703c3e' }
    @{ File='mvc.10'; Offset=0x072DCB; After='00c020cf51fc' }
    @{ File='mvc.10'; Offset=0x072DD2; After='fc2348443443' }
    @{ File='mvc.10'; Offset=0x072DD9; After='0000fefc13' }
    @{ File='mvc.10'; Offset=0x072DDF; After='00' }
    @{ File='mvc.10'; Offset=0x072DE1; After='001cfefc13' }
    @{ File='mvc.10'; Offset=0x072DE7; After='00' }
    @{ File='mvc.10'; Offset=0x072DE9; After='001dfe754e00702d0c080000c00e65b90c48443443' }
    @{ File='mvc.10'; Offset=0x072DFF; After='0000fe02660170754e023048e5f941' }
    @{ File='mvc.10'; Offset=0x072E0F; After='00e0fdb05200000466b052000030220000f941' }
    @{ File='mvc.10'; Offset=0x072E23; After='0014fe81210000754ef941' }
    @{ File='mvc.10'; Offset=0x072E2F; After='001cfebc11' }
    @{ File='mvc.10'; Offset=0x072E35; After='000020f941' }
    @{ File='mvc.10'; Offset=0x072E3B; After='001efe30420020f941' }
    @{ File='mvc.10'; Offset=0x072E45; After='0020fe30420020f941' }
    @{ File='mvc.10'; Offset=0x072E4F; After='0022fe30420020f941' }
    @{ File='mvc.10'; Offset=0x072E59; After='0026fe30420020f941' }
    @{ File='mvc.10'; Offset=0x072E63; After='0030fe30420020f941' }
    @{ File='mvc.10'; Offset=0x072E6D; After='0032fe30420020f941' }
    @{ File='mvc.10'; Offset=0x072E77; After='0036fe30420020f941' }
    @{ File='mvc.10'; Offset=0x072E81; After='00dcfe30420020754e3910' }
    @{ File='mvc.10'; Offset=0x072E8D; After='00d9fe424a026708e800020f00754e00020f003912' }
    @{ File='mvc.10'; Offset=0x072EA3; After='00d9fe424a0e660102f0000082c113' }
    @{ File='mvc.10'; Offset=0x072EB3; After='00d9fe754e08e901020f000082c113' }
    @{ File='mvc.10'; Offset=0x072EC3; After='00d9fe754e006162' }
    @{ File='mvc.10'; Offset=0x072ECC; After='006194000061a4fd00702f7ec026c026cf51fa' }
    @{ File='mvc.10'; Offset=0x072EE0; After='023249e5f941' }
    @{ File='mvc.10'; Offset=0x072EE7; After='0004feb0420010f941' }
    @{ File='mvc.10'; Offset=0x072EF1; After='000cfeb0420010f941' }
    @{ File='mvc.10'; Offset=0x072EFB; After='0014feb0420010f941' }
    @{ File='mvc.10'; Offset=0x072F05; After='00e0fdb0420010f941' }
    @{ File='mvc.10'; Offset=0x072F0F; After='00ecfdb0420010f941' }
    @{ File='mvc.10'; Offset=0x072F19; After='00e8fd30420020f941' }
    @{ File='mvc.10'; Offset=0x072F23; After='004efe30420020f941' }
    @{ File='mvc.10'; Offset=0x072F2D; After='005efe30420020f941' }
    @{ File='mvc.10'; Offset=0x072F37; After='002cfe30420020f941' }
    @{ File='mvc.10'; Offset=0x072F41; After='002efe30420020f941' }
    @{ File='mvc.10'; Offset=0x072F4B; After='00eafd30420020e74800c00070006142' }
    @{ File='mvc.10'; Offset=0x072F5C; After='df4c0300754ef941' }
    @{ File='mvc.10'; Offset=0x072F65; After='0034fe304a00201267017002d039b0' }
    @{ File='mvc.10'; Offset=0x072F75; After='00d8fe06663942' }
    @{ File='mvc.10'; Offset=0x072F7D; After='00d8fe30420020754e021200' }
    @{ File='mvc.10'; Offset=0x072F8A; After='041200' }
    @{ File='mvc.10'; Offset=0x072F8E; After='00123230021e00' }
    @{ File='mvc.10'; Offset=0x072F96; After='041e00' }
    @{ File='mvc.10'; Offset=0x072F9A; After='020a00' }
    @{ File='mvc.10'; Offset=0x072F9E; After='022c00' }
    @{ File='mvc.10'; Offset=0x072FA2; After='042c00' }
    @{ File='mvc.10'; Offset=0x072FA6; After='020400' }
    @{ File='mvc.10'; Offset=0x072FAA; After='020e00' }
    @{ File='mvc.10'; Offset=0x072FAE; After='0c2000' }
    @{ File='mvc.10'; Offset=0x072FB2; After='042000' }
    @{ File='mvc.10'; Offset=0x072FB6; After='0a1800' }
    @{ File='mvc.10'; Offset=0x072FBA; After='0c1600' }
    @{ File='mvc.10'; Offset=0x072FBE; After='000c282800103131001c323000010000000002000000000000000003000000000400000000000000000500000000060000000000000000070000000008000000000000000009000000000a00000000000000000b000000000c00000000000000000d000000000e00000000000000000f00000000100000000000000000110000000012000000000000000013000000001400000000000000001500000000160000000000000000170000000018000000000000000019000000001a00000000000000001b000000001c00000000000000001d000000001e00000000000000001f00000000200000000000000000210000000022000000000000000023000000002400000000000000002500000000260000000000000000270000000028000000000000000029000000002a00000000000000002b000000002c00000000000000002d000000002e00000000000000002f00000000300000000000000000310000000032000000000000000033000000003400000000000000003500000000360000000000000000370000000038000000000000000039000000003a00000000000000003b000000003c00000000000000003d000000003e00000000000000003f00000000400000000000000000410000000000000000000042000000000000000000000000000043000000000000000000004400000000000000000000000000004500000000000000000000460000000000000000000000000000470000000000000000000048000000000000000000000000000049000000000000000000004a00000000000000000000000000004b000000000000000000004c00000000000000000000000000004d000000000000000000004e00000000000000000000000000004f00000000000000000000500000000000000000000000000000510000000000000000000052000000000000000000000000000053000000000000000000005400000000000000000000000000005500000000000000000000560000000000000000000000000000570000000000000000000058000000000000000000000000000059000000000000000000005a00000000000000000000000000005b000000000000000000005c00000000000000000000000000005d000000000000000000005e00000000000000000000000000005f00000000000000000000600000000000000000000000000000610000000000000000000062000000000000000000000000000063000000000000000000006400000000000000000000000000006500000000000000000000660000000000000000000000000000670000000000000000000068000000000000000000000000000069000000000000000000006a00000000000000000000000000006b000000000000000000006c00000000000000000000000000006d000000000000000000006e00000000000000000000000000006f00000000000000000000700000000000000000000000000000710000000000000000000072000000000000000000000000000073000000000000000000007400000000000000000000000000007500000000000000000000760000000000000000000000000000770000000000000000000078000000000000000000000000000079000000000000000000007a00000000000000000000000000007b000000000000000000007c00000000000000000000000000007d000000000000000000007e00000000000000000000000000007f00000000000000000000800000000000000000000000000000810000000000000000000082000000000000000000000000000083000000000000000000008400000000000000000000000000008500000000000000000000860000000000000000000000000000870000000000000000000088000000000000000000000000000089000000000000000000008a00000000000000000000000000008b000000000000000000008c00000000000000000000000000008d000000000000000000008e00000000000000000000000000008f00000000000000000000900000000000000000000000000000910000000000000000000092000000000000000000000000000093000000000000000000009400000000000000000000000000009500000000000000000000960000000000000000000000000000970000000000000000000098000000000000000000000000000099000000000000000000009a00000000000000000000000000009b000000000000000000009c00000000000000000000000000009d000000000000000000009e00000000000000000000000000009f00000000000000000000a00000000000000000000000000000a100000000000000000000a20000000000000000000000000000a300000000000000000000a40000000000000000000000000000a500000000000000000000a60000000000000000000000000000a700000000000000000000a80000000000000000000000000000a900000000000000000000aa0000000000000000000000000000ab00000000000000000000ac0000000000000000000000000000ad00000000000000000000ae0000000000000000000000000000af00000000000000000000b00000000000000000000000000000b100000000000000000000b20000000000000000000000000000b300000000000000000000b40000000000000000000000000000b500000000000000000000b60000000000000000000000000000b700000000000000000000b80000000000000000000000000000b900000000000000000000ba0000000000000000000000000000bb00000000000000000000bc0000000000000000000000000000bd00000000000000000000be0000000000000000000000000000bf00000000000000000000c00000000000000000000000000000c100000000000000000000c20000000000000000000000000000c300000000000000000000c40000000000000000000000000000c500000000000000000000c60000000000000000000000000000c700000000000000000000c80000000000000000000000000000c900000000000000000000ca0000000000000000000000000000cb00000000000000000000cc0000000000000000000000000000cd00000000000000000000ce0000000000000000000000000000cf00000000000000000000d0000000000000000000000000003456425449000800020088bd02000002020088bd280000020200bebd0200000c0200bebd2800000c02002af60400000a02003af60400000c02004af6040000100300a828060000060300a8282600000603000e290600000c03000e292600000c03004e290600001403004e29260000140300366a080000100300466a080000060300606a0800000803007c6a0800000e030080960a00000a030090960a0000140300a0960a00001c0300babb0c0000060300cabb0c000008030002f90e000008030012f90e00000a030022f90e000018040012421000000804002e421000000a040064421000000e040090991200000a0400a0991200000a0400d0991200000c0400ec99120000160400069a1200001a04001a9a1200003004002e9a120000320400429a1200001c04005e9a1200031e0400709a120000200400ba9a120000220400fc9a120000340400eec71400000004002ec81400000c040060f31600000604007cf31600001604008cf3160000080400b8f31600000a05004a33180000040500663318000006050082331800000805001c8a1a00000a0500268a1a0000220500308a1a00002805006a8a1a00002405004acb1c0000080500aacb1c0000140500cacb1c0000180600800f1e00000c0600b40f1e00000e0600c40f1e0000120600d40f1e00031a0600e60f1e00031a0600e259200000080600fe592000000a0600345a2000000e0600e88c240000060600f88c240000080600e6bb2a000020060036bc2a000326060048bc2a000028070022032c00000c070044032c00000a0700b8032c00001c3f0020412000001c' }
    @{ File='mvc.10'; Offset=0x074000; After='00616003004a0c66b94e010050a1f94e0600ca10754efa450801ee47c801b94e3f00ec42fa4e760400000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0c1c00e6000c6700702e10e600f94e06000a2d2e3008000c67400c020000676000006098006e540800b94e01003476b94e0000b0a40070402d1400402d1800402d1c00402d20007c3d3c004e007c1d460080006e428400ee50a1032e4a020006666d5226c004606d5228c014700472b94e0100e635b94e0b00205ef84ed81db84ed81d6e534e003c676e0c2c004e0028666e5408002e429a0300616001f870cf72b94e0100fe48b94e0200ee7100610e01fa412800b84efc1d754eb84ed81d6e534e00f466f94e0100ba6f030000801c00000004000500010070000000' }
    @{ File='mvc.10'; Offset=0x074133; After='7f3100f6be009000a000000600000000000000002f0061fa01004a10661f206e2054002e300400f94e09004c608f58754e0000000000000000e748f2c00061400008202c674e2448266d224e5a09201467cab30a67492c00612600cbb1126769222c00e8602d4ab7790e664b2c00610001df4c034ff84e9e45df4c034f754e6e0c2400240054666e0c220052004c662e4a26000e6b2e0c1c0027003e666e2054002a606e20540008203067680c240024002866680c220052002066284a26001a6b280c1c00270012666820540008200a67680c200052000266754ec891754e00726d204e5a08202a67680c240024001c66680c220052001466284a26000e6be8bd540008667c111c002700015268202c00d260014a046600615600754e2e0ca500ce0144676e20c8022e42cf012e4a77020a677c1d0100cf01fcd06000e8414000ee43d0017c241c0044bc0570d022da20c851fa' }
    @{ File='mvc.10'; Offset=0x074288; After='ee4300020170d022da20c851fa' }
    @{ File='mvc.10'; Offset=0x074296; After='7c1da500ce01f94e0000b0a42e0ca500ce0140666e20c8022e4acf010467fcd06000e8414000ee43d0010570d920a942fc' }
    @{ File='mvc.10'; Offset=0x0742C8; After='c851f8' }
    @{ File='mvc.10'; Offset=0x0742CC; After='ee4300020170d920a942fc' }
    @{ File='mvc.10'; Offset=0x0742D8; After='c851f8' }
    @{ File='mvc.10'; Offset=0x0742DC; After='2e42ce012e42cf01f94e0000b0a4754e0060f200000000002e10b000000c28001867000c2a00126700550e6300510a6700590a626e4a080004660170754e0070754e00000000000000000000000000000000000000000000000000000070402dc801403dcc01754e00616cfe08201267e7487e7f48264b2cb94e0200de72df4cfe7e0070754e2e3010006eb0c4021c66006186' }
    @{ File='mvc.10'; Offset=0x074370; After='004a14670060a0fc000000000000000000000000000000000061ae' }
    @{ File='mvc.10'; Offset=0x07438C; After='0070754e48eaac0c0f0072788c001a66e748c2804e224c2c00610cfec9b10666df4c0143754edf4c0143f94e3f0032194020fcb10f0072780e666d0c000a00c00666f94e01002224280805000400f94e01001424130c080000673c00b94e010010970066a400130c08000066a0002b0c0e000100006696002e30d6004002700000678a000032415340c2006680002b5301000270754e2e30d6004002700000675e000032415340c200661e002b0c0d00010000670c002b0c0c000100006640002b5301000270754e2e32d800414640c200672c002e0c2a00b00000660e004a22b94e3f00004f00650e0000708026403704000170754e0061b4fe0070754eb94e01001097006706000170754e0070754e000c02002e67004a146700702e1002002d0138c00c662e0c0100740204640070754e7c1d04004d007c1d1c00e600f94e0600f0170270754e' }
    @{ File='mvc.10'; Offset=0x074F00; After='e740e748f8' }
    @{ File='mvc.10'; Offset=0x074F06; After='b94e3f00ee2d004a2667b94e3f00da16004a1c67df4c' }
    @{ File='mvc.10'; Offset=0x074F1D; After='1fdf44e740e748f8' }
    @{ File='mvc.10'; Offset=0x074F26; After='b94e3f006818df4c' }
    @{ File='mvc.10'; Offset=0x074F2F; After='1fdf440070754edf4c' }
    @{ File='mvc.10'; Offset=0x074F39; After='1fdf44fc440100754ee740e74880c00061a4de004a446700702e100200000c01003862f941' }
    @{ File='mvc.10'; Offset=0x074F5F; After='0022fe300c010000002a66f941' }
    @{ File='mvc.10'; Offset=0x074F6D; After='0026fe300c0a0000001c66f941' }
    @{ File='mvc.10'; Offset=0x074F7B; After='0024fe301200002eb2e6000c66df4c0301df443c02fb00754edf4c0301df442e0c0400b400754e' }
    @{ File='mvce.03a'; Offset=0x004000; After='a14b6ca34f67' }
    @{ File='mvce.03a'; Offset=0x004046; After='a0adb71acd83' }
    @{ File='mvce.03a'; Offset=0x0040AC; After='8b44f5859ea7' }
    @{ File='mvce.03a'; Offset=0x00410E; After='1886e3829281' }
    @{ File='mvce.03a'; Offset=0x004174; After='cb79d259a61c' }
    @{ File='mvce.03a'; Offset=0x0041D8; After='aec0c3638c1c' }
    @{ File='mvce.03a'; Offset=0x00421E; After='b581d97fdba6' }
    @{ File='mvce.03a'; Offset=0x00427C; After='ea1ebdaa4cbc' }
    @{ File='mvce.03a'; Offset=0x0042D7; After='fe53c18501' }
    @{ File='mvce.03a'; Offset=0x004332; After='8656fcdaf240' }
    @{ File='mvce.03a'; Offset=0x00438A; After='3eb3920f2bde' }
    @{ File='mvce.03a'; Offset=0x0043D0; After='e3a92d1db3f5' }
    @{ File='mvce.03a'; Offset=0x00442C; After='b9bdbad7ad19' }
    @{ File='mvce.03a'; Offset=0x004484; After='c1c78a1fb166' }
    @{ File='mvce.03a'; Offset=0x0044DE; After='090cf95260c4' }
    @{ File='mvce.03a'; Offset=0x0044E6; After='40891797cbe7' }
    @{ File='mvce.03a'; Offset=0x004542; After='1c33bbc928f1' }
    @{ File='mvce.03a'; Offset=0x00459E; After='7805aeb60191' }
    @{ File='mvce.03a'; Offset=0x00A31C; After='58f4a2161a1d' }
    @{ File='mvce.03a'; Offset=0x00D560; After='3d59a3e908f2' }
    @{ File='mvce.03a'; Offset=0x01240C; After='552243378279e4d5' }
    @{ File='mvce.03a'; Offset=0x017476; After='319c30389ef72547' }
    @{ File='mvce.03a'; Offset=0x018DB6; After='c0ce64aa061af0a1' }
    @{ File='mvce.03a'; Offset=0x01B74E; After='897e7aaf5118' }
    @{ File='mvce.03a'; Offset=0x01CCA8; After='f4a77e7207e7' }
    @{ File='mvce.03a'; Offset=0x01CD10; After='afcaa968482e' }
    @{ File='mvce.03a'; Offset=0x01CD1E; After='59a8a5a949dac4af' }
    @{ File='mvce.03a'; Offset=0x03C106; After='6cc763090754' }
    @{ File='mvce.03a'; Offset=0x0610C4; After='b1ca59e69a55' }
    @{ File='mvce.03a'; Offset=0x062D04; After='9623014d451c' }
    @{ File='mvce.04a'; Offset=0x016044; After='ddf2452d5a148840' }
    @{ File='mvce.04a'; Offset=0x0162C2; After='b5c1b3bb' }
    @{ File='mvce.04a'; Offset=0x043C98; After='ec6a2e6be46a406b086be86a206b026b286b' }
    @{ File='mvce.04a'; Offset=0x043CB8; After='e86a046b2a6bec6a0e6b006be46a0c6b' }
    @{ File='mvce.04a'; Offset=0x07788A; After='5a' }
)
$HasBeforeProof = $false

$FingerprintBuilder = New-Object System.Text.StringBuilder
foreach ($Patch in $Patches) {
    if ($HasBeforeProof) {
        [void]$FingerprintBuilder.Append(('{0}|{1:x6}|{2}|{3}' -f [string]$Patch.File, [int]$Patch.Offset, [string]$Patch.Before, [string]$Patch.After))
    } else {
        [void]$FingerprintBuilder.Append(('{0}|{1:x6}|{2}' -f [string]$Patch.File, [int]$Patch.Offset, [string]$Patch.After))
    }
    [void]$FingerprintBuilder.Append([char]10)
}
$Fingerprint = Get-Sha256 ([System.Text.Encoding]::ASCII.GetBytes($FingerprintBuilder.ToString()))
if ($Fingerprint -ne '27bd102055f7616d48701e87b427cb5d0e8a07cd4153035258c07e3e27611446') {
    Fail 'internal patch fingerprint mismatch; re-download this installer.' 8
}

$ByFile = New-Object 'System.Collections.Generic.Dictionary[string,object]'
foreach ($Patch in $Patches) {
    $Name = [string]$Patch.File
    if (-not $Entries.ContainsKey($Name)) { Fail "internal patch references unknown member '$Name'." 8 }
    $Buffer = [byte[]]$Entries[$Name]
    $After = ConvertFrom-Hex ([string]$Patch.After)
    if ([int]$Patch.Offset -lt 0 -or [int]$Patch.Offset + $After.Length -gt $Buffer.Length) {
        Fail 'internal patch range is outside its member.' 8
    }
    if ($HasBeforeProof) {
        $Before = ConvertFrom-Hex ([string]$Patch.Before)
        if ($Before.Length -ne $After.Length) { Fail 'internal patch length mismatch.' 8 }
        if (-not (Test-Bytes $Buffer ([int]$Patch.Offset) $Before)) {
            Fail ("{0} stock-byte proof failed at +0x{1:X6}; nothing was written." -f $Name,[int]$Patch.Offset)
        }
    }
    [Array]::Copy($After, 0, $Buffer, [int]$Patch.Offset, $After.Length)
    if (-not $ByFile.ContainsKey($Name)) { $ByFile[$Name] = [pscustomobject]@{ Hunks=0; Bytes=0 } }
    $ByFile[$Name].Hunks = $ByFile[$Name].Hunks + 1
    $ByFile[$Name].Bytes = $ByFile[$Name].Bytes + $After.Length
}
foreach ($Name in ($ByFile.Keys | Sort-Object)) {
    Write-Host ("  patch : {0,-9} {1,4} hunks, {2,6} embedded bytes" -f $Name,$ByFile[$Name].Hunks,$ByFile[$Name].Bytes)
}

$Patched = New-Object 'System.Collections.Generic.Dictionary[string,string]'
$Patched['mvc.01'] = '565f2c1befc6dbcd727b65c8954d3263b1e8105cd16be3ff7399c0ff513d144e'
$Patched['mvc.02'] = 'b460ea0d95c967e5276d0f1f6e0a68d3bcc6008ce7952b970069a211e460ec63'
$Patched['mvc.05a'] = '1dfd50972c8796624051857e16ddc2296932c39fb05ecfcd1bae6180a369285d'
$Patched['mvc.06a'] = '132316e99d02d197cd8b4b9227dccd9215f5f741bcd21d5abf5c3f07fb64354b'
$Patched['mvc.07'] = '8b29a492800ec41c9818f1cf880697b298af69c75d0dd6864ed06e65223930eb'
$Patched['mvc.08'] = '402a848e3860f20cdcf3ec80c640f27eaef36f4e7cd78a330913baedcd5356d8'
$Patched['mvc.09'] = 'fd0e680e0e1b14a5d1e913ddaef37076dd80203326e305b1fe1f8070be0cd6b2'
$Patched['mvc.10'] = '36faa4cda75b5a5775f1fe4355db3f94f82d98a57a4af6d604273399147ae4d0'
$Patched['mvc.11m'] = '5587602fb97953d0cd951392b3bbaef2d317ae943ff2f6608c46cb627b7b16ca'
$Patched['mvc.12m'] = '971b949ca3ad2471bf5ddc5c87c10286eacba51c30b4cc2261328ec46732b920'
$Patched['mvc.13m'] = '689b9f2e2f9105f6b6a456e836a289c65caf642d9c7d246ea95c2db256f2ce0d'
$Patched['mvc.14m'] = '1be6ba60b3cc0e6b647c2a54ca06b948dbc72eb32efdead84bcaa1d2efd69db5'
$Patched['mvc.15m'] = '37365288e38a8c41fb5d2eb72808038478def8c8aa368d85816b70a89f6a6f55'
$Patched['mvc.16m'] = 'c94231770a7377bf6c7817427f28b87db79f3be03287279e8a19bea34cca85be'
$Patched['mvc.17m'] = 'dc29f2f0bf56d60408e9b9a2fcfae6c684f8be97712c94f146386c9bbb9ab46f'
$Patched['mvc.18m'] = '4f3ceefa11958fd92f88047f876e37a5a9a226ca9c28e3b9915a03f39a268947'
$Patched['mvc.19m'] = 'd245405b8fa57b315300d915b9b5f96859bc31b9a97f653e370c7f0f28a1fc7f'
$Patched['mvc.20m'] = '6cb08b23e33cc97bd14c6bf0ed179c99952146328f0dc0f01e8135c2783466bd'
$Patched['mvce.03a'] = 'b3dfef4b2a63664adae9fbe095aab5b07ea5dde9b547b2ad4dc881c2d39fcacd'
$Patched['mvce.04a'] = '782b0fdcd1cff8b5e8082a5eeef26ad2a425313bf6a9770beb054a8b76a6e761'
$Patched['mvsc.key'] = '9ba914d01fdb50c562fef4d4a5c7ff4779f92340322272696a46025d33f7155c'
foreach ($Record in $Vanilla) {
    $Name = [string]$Record.Name
    $Got = Get-Sha256 ([byte[]]$Entries[$Name])
    if ($Got -ne $Patched[$Name]) {
        Fail "internal patched-member proof failed for $Name; nothing was written." 8
    }
}

$Destination = Join-Path (Split-Path -Parent $Source) 'mvsc_dhc_v4.zip'
$Destination = [IO.Path]::GetFullPath($Destination)
if ($Destination -eq [IO.Path]::GetFullPath($Source)) { Fail 'refusing to overwrite the input archive.' }
$ReceiptPath = "$Destination.receipt.json"
$Temporary = "$Destination.part"
$ReceiptTemporary = "$ReceiptPath.part"
foreach ($Path in @($Destination,$ReceiptPath,$Temporary,$ReceiptTemporary)) {
    if (Test-Path -LiteralPath $Path) { Fail "refusing to overwrite existing output: $Path" }
}

$File = [IO.File]::Open($Temporary, [IO.FileMode]::CreateNew, [IO.FileAccess]::ReadWrite, [IO.FileShare]::None)
try {
    $Output = New-Object System.IO.Compression.ZipArchive($File, [IO.Compression.ZipArchiveMode]::Create, $true)
    try {
        foreach ($Name in $Order) {
            $NewEntry = $Output.CreateEntry($Name, [IO.Compression.CompressionLevel]::Optimal)
            try {
                $NewEntry.LastWriteTime = $Metadata[$Name].LastWriteTime
                $NewEntry.ExternalAttributes = $Metadata[$Name].ExternalAttributes
            } catch {
                # Member order and bytes are authoritative; metadata is best effort.
            }
            $Stream = $NewEntry.Open()
            try {
                $Bytes = [byte[]]$Entries[$Name]
                $Stream.Write($Bytes, 0, $Bytes.Length)
            } finally { $Stream.Dispose() }
        }
    } finally { $Output.Dispose() }
} catch {
    $WriteError = $_.Exception.Message
    $File.Dispose()
    if (Test-Path -LiteralPath $Temporary) { Remove-Item -LiteralPath $Temporary -Force }
    Fail "could not write output ZIP: $WriteError" 8
} finally {
    $File.Dispose()
}

try {
    $Written = Read-ZipMembers $Temporary
    if ($Written.Order.Count -ne $Order.Count) { throw 'output member count changed during write.' }
    for ($i = 0; $i -lt $Order.Count; $i++) {
        if ($Written.Order[$i] -cne $Order[$i]) { throw "output member order changed at index $i." }
    }
    foreach ($Record in $Vanilla) {
        $Name = [string]$Record.Name
        if (-not $Written.Entries.ContainsKey($Name)) { throw "output is missing $Name." }
        $Bytes = [byte[]]$Written.Entries[$Name]
        if ($Bytes.Length -ne [int]$Record.Size) { throw "output size check failed for $Name." }
        if ((Get-Sha256 $Bytes) -ne $Patched[$Name]) { throw "output SHA-256 check failed for $Name." }
    }
} catch {
    $VerifyError = $_.Exception.Message
    if (Test-Path -LiteralPath $Temporary) { Remove-Item -LiteralPath $Temporary -Force }
    Fail "output verification failed: $VerifyError" 8
}

$InstallerSha = Get-Sha256 ([IO.File]::ReadAllBytes($env:SELFPATH))
$ChangedMembers = @(
    [pscustomobject][ordered]@{ name='mvc.10'; vanillaSha256='e24119140931bc861bf791758af8eb375892260d8ffb633369ebedcbe21f172a'; patchedSha256='36faa4cda75b5a5775f1fe4355db3f94f82d98a57a4af6d604273399147ae4d0' }
    [pscustomobject][ordered]@{ name='mvce.03a'; vanillaSha256='48128b6f98c5171a0e734e99f01a273f526f2da74f08635732068c60c891d757'; patchedSha256='b3dfef4b2a63664adae9fbe095aab5b07ea5dde9b547b2ad4dc881c2d39fcacd' }
    [pscustomobject][ordered]@{ name='mvce.04a'; vanillaSha256='71ded7040f279d0ddea1326fc062465159ccd832a327230098e5740d2a747d67'; patchedSha256='782b0fdcd1cff8b5e8082a5eeef26ad2a425313bf6a9770beb054a8b76a6e761' }
)
$ReceiptPatches = @(
    foreach ($Patch in $Patches) {
        $AfterBytes = ConvertFrom-Hex ([string]$Patch.After)
        [pscustomobject][ordered]@{
            member = [string]$Patch.File
            offset = ('0x{0:X6}' -f [int]$Patch.Offset)
            bytes = $AfterBytes.Length
            afterSha256 = Get-Sha256 $AfterBytes
        }
    }
)
$Receipt = [pscustomobject][ordered]@{
    format = 5
    status = 'installed'
    release = 'MVSC-DHC roster-wide'
    version = 'v4'
    draft = $false
    installer = [pscustomobject][ordered]@{ name = [IO.Path]::GetFileName($env:SELFPATH); sha256 = $InstallerSha }
    cleanBaseOnly = $true
    romExpansion = $false
    downloadsRom = $false
    networkAccess = $false
    embedsStockBytes = $HasBeforeProof
    inputArchive = [IO.Path]::GetFileName($Source)
    inputArchiveSha256 = Get-Sha256 ([IO.File]::ReadAllBytes($Source))
    outputArchive = [IO.Path]::GetFileName($Destination)
    outputArchiveSha256 = Get-Sha256 ([IO.File]::ReadAllBytes($Temporary))
    changedMembers = $ChangedMembers
    patches = $ReceiptPatches
    patchFingerprint = $Fingerprint
}
try {
    $ReceiptJson = ($Receipt | ConvertTo-Json -Depth 10) + [Environment]::NewLine
    $Utf8NoBom = New-Object System.Text.UTF8Encoding -ArgumentList $false
    [IO.File]::WriteAllText($ReceiptTemporary, $ReceiptJson, $Utf8NoBom)
    $ReceiptCheck = Get-Content -LiteralPath $ReceiptTemporary -Raw | ConvertFrom-Json
    if ([string]$ReceiptCheck.status -ne 'installed') { throw 'receipt status mismatch.' }
    if ([string]$ReceiptCheck.patchFingerprint -ne '27bd102055f7616d48701e87b427cb5d0e8a07cd4153035258c07e3e27611446') { throw 'receipt patch fingerprint mismatch.' }
} catch {
    $ReceiptError = $_.Exception.Message
    foreach ($Path in @($Temporary,$ReceiptTemporary)) {
        if (Test-Path -LiteralPath $Path) { Remove-Item -LiteralPath $Path -Force }
    }
    Fail "could not write or verify receipt: $ReceiptError" 8
}

try {
    Move-Item -LiteralPath $Temporary -Destination $Destination
    try {
        Move-Item -LiteralPath $ReceiptTemporary -Destination $ReceiptPath
    } catch {
        if (Test-Path -LiteralPath $Destination) { Remove-Item -LiteralPath $Destination -Force }
        throw
    }
} catch {
    $PromotionError = $_.Exception.Message
    foreach ($Path in @($Temporary,$ReceiptTemporary)) {
        if (Test-Path -LiteralPath $Path) { Remove-Item -LiteralPath $Path -Force }
    }
    Fail "could not promote verified output and receipt: $PromotionError" 8
}

Write-Host ''
Write-Host '  DONE. Wrote and re-verified:' -ForegroundColor Green
Write-Host "    $Destination"
Write-Host "    $ReceiptPath"
Write-Host ''
Write-Host '  Patched members: mvc.10, mvce.03a, mvce.04a; 21 member names, sizes, input order, and the real key are preserved.'
Write-Host '  The original ROM was not changed.'
Write-Host ''
Write-Host '  NETPLAY / CRC NOTE' -ForegroundColor Yellow
Write-Host '  Both peers need byte-identical patched member data and a room/emulator'
Write-Host '  that accepts modified sets. Official Fightcade support is not claimed.'
Write-Host ''
Write-Host ('  patch fingerprint  ' + $Fingerprint)
Write-Host ''
Pause-IfConsole
exit 0
